時間限制 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;
}
}