时间限制 1000 ms 内存限制 65536 KB
题目描述
我们都学过计算机网络,了解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
先分隔字符串,转化成整数,Yes的情况0-255。
No的情况分三种:
1.分割以后含有字母
2.转化出来的整数不在0-255范围内
3.题目说了“字符串的长度保证不超过15,不小于1.”,也就是说输入1.、f.、1.1.1.、1.1.1.1.1.1都有可能,因此设置一个count保存正确的数目
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
bool isIP(int x){
return (x>=0&&x<=255)?true:false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
char s[50],*p;
scanf("%s",s);
const char *d = ".";
int x,flag = 1,count = 0;
p = strtok(s,d);
while(p) //对分割后的每一部分进行处理
{
for(int i = 0;i < strlen(p);i ++){
if(p[i] < '0' || p[i]> '9'){
flag = -1;
break;
}
}
if(flag == -1) break; //含有字母
else{
x = atoi(p);
if(!isIP(x)){
flag = -1;
break; //不在0-255
}
else count ++;
}
p=strtok(NULL,d);
}
if(flag==1&&count==4) printf("Yes\n"); //最终四个正确数字
else printf("No\n");
}
return 0;
}
顺带一提strtok()这个函数挺有意思,可以指定多个分割字符,详情参见:
https://www.cnblogs.com/devcjq/articles/2915379.html