问题 1116: IP判断
时间限制: 1Sec 内存限制: 128MB 提交: 1804 解决: 698
题目描述
在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。
合法的IP是这样的形式:
A.B.C.D
其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整
数中不允许有前导零存在,如001这种情况。
现在,请你来完成这个判断程序吧_
输入
输入由多行组成,每行是一个字符串,输入由“End of file”结束。
字符串长度最大为30,且不含空格和不可见字符
输出 对于每一个输入,单独输出一行 如果该字符串是合法的IP,输出Y,否则,输出N
样例输入
1.2.3.4
a.b.c.d
267.43.64.12
12.34.56.bb
210.43.64.129
-123.4.5.6
样例输出
Y
N
N
N
Y
N
提示
无
这个题还真得用巧办法才好做,使用sscanf()很大程度降低了复杂性!(虽然其它算法也不太难),事实上练题的朋友多了解一些很有用的函数总是可以派得上用场的~
简单说说sscanf()
函数吧,就是和scanf()很相似,只是与之相区别的是,scanf()
是从屏幕上获取值,而它是从指定的字符串中获取值;
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
没有对比就没有伤害,看代码体会下。
巧用sscanf():
#include<cstdio>
using namespace std;
#define p(n) n>=0&&n<=255
int main(){
int a,b,c,d;
char s[20];
int k;
while(~scanf("%s",s)){
if(sscanf(s,"%d.%d.%d.%d",&a,&b,&c,&d)==4)
if(p(a)&&p(b)&&p(c)&&p(d)) printf("Y\n");
else printf("N\n");
else printf("N\n");
}
return 0;
}
用比较笨的各种排查:
#include<iostream>
#include<string.h>
using namespace std;
#define Y 1
#define N 0
int main(){
char a[20];
while(cin>>a){
int i,len=strlen(a),judge=Y;
int pointNumber=0,num=0;
for(i=0;i<len;i++) //判断是否有非法字符
if((a[i]<'0'||a[i]>'9')&&a[i]!='.') {judge=N;break;}
for(i=0;i<len;i++){
if(a[i]=='0'){ //判断0是否非法
if(i==0&&a[i+1]!='.'){judge=N; break;}
if(i!=0&&(a[i+1]!='.'&&i!=len-1)){judge=N; break;}
}
if(a[i]>='0'&&a[i]<='9') num=num*10+a[i]-48; //计算整数
if(num>255&&(a[i]=='.'||i==len-1)){judge=N; break;} //判断整数是否非法
if(a[i]=='.'){ //判断句点是否非法
pointNumber+=1;num=0;
if((a[i+1]<'0'&&a[i+1]>'9')||a[i+1]=='.'){judge=N; break;}
}
}
if(judge==Y&&pointNumber==3) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
return 0;
}