时间限制 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
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a[4];
char c,s[20];
memset(a,-1,sizeof(a));
scanf("%s",s);//先用s数组接收输入字符串
/*然后用sscanf将s按照点分十进制格式进行赋值,sscanf的返回值为成功
赋值的个数
为什么是sscanf(s,"%d.%d.%d.%d%c",&a[0],&a[1],&a[2],&a[3],&c)==4
而不是sscanf(s,"%d.%d.%d.%d",&a[0],&a[1],&a[2],&a[3])==4
因为不加%c的话1.1.1.1afaf这类格式(即正确的IP地址后还有多余的其他字符)
也算正确,如果加个%c,这种情况的sscanf返回值就是5了,可排除此类格式*/
if(sscanf(s,"%d.%d.%d.%d%c",&a[0],&a[1],&a[2],&a[3],&c)==4&&
a[0]>=0&&a[0]<=255&&a[1]>=0&&a[1]<=255
&&a[2]>=0&&a[2]<=255&&a[3]>=0&&a[3]<=255)
printf("Yes\n");
else printf("No\n");
//cout<<sscanf(s,"%d.%d.%d.%d",&a[0],&a[1],&a[2],&a[3])<<endl;
//cout<<a[3]<<endl;
}
}