IP判断(ssscanf()函数)

问题 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;
}
发布了34 篇原创文章 · 获赞 22 · 访问量 8748

猜你喜欢

转载自blog.csdn.net/qq_41247335/article/details/86776979