题目描述
我们都学过计算机网络,了解IPV4地址的点分十进制表示法。
你的任务很简单:判断一个字符串是否是一个合法的点分十进制表示的IPV4地址。
最低的IP地址是0.0.0.0,最高的IP地址是255.255.255.255。
PS :方便起见,认为形似00.00.00.00的IP地址也是合法的。
输入格式
第一行是一个整数T,代表输入还剩下T行
以下的T行,每行都是一个字符串(不含空白字符)。字符串的长度保证不超过15,不小于1.
输出格式
对于每个字符串,输出一行。
如果它是一个合法的IPV4地址,输出Yes。
否则,输出No。
输入样例
3
59.64.130.18
f.a.t.e
1.23.45.678
输出样例
Yes
No
No
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
char s[20];
scanf("%s",s);
int loc[10]={0};
int cnt = 0;
loc[cnt++] = -1;
int flag = 0;
for(int i = 0; i < strlen(s); i++)
{
if(s[i] == '.')
loc[cnt++] = i;
else if(s[i] < '0' || s[i] > '9')
flag = 1;
}
loc[cnt++] = strlen(s);
//for(int i = 0; i < cnt; i++)
// cout<<loc[i]<<endl;
// cout<<"-------"<<endl;
// cout<<cnt<<" "<<flag<<endl;
if(cnt !=5 || flag )
{
puts("No");
continue;
}
for(int i = 1; i < cnt; i++)
{
int left = loc[i-1];
int right = loc[i];
if(right - left <=1)
{
flag=1;break;
}
int tmp = 0;
for(int j = left+1; j < right; j++)
tmp = tmp*10 + s[j]-'0';
// cout<<left<<" "<<right<<" "<<tmp<<endl;
if(tmp > 255 || tmp < 0)
{
flag = 1;
break;
}
}
if(flag)
puts("No");
else
puts("Yes");
}
}