HZU挑战自我


私信TA

用户名:gxhzxyjsj

访问量:8420

签 名:

加油哦!楼下被超越!正在追赶楼上的大佬们。

排  名 7
经  验 11027
参赛次数 4
文章发表 142
年  龄 0
在职情况
学  校 贺州学院
专  业 软件工程

  自我简介:

弱鸡一个

解题思路:用字符串分割函数strtok(),以.去分割字符串,然后判断分割的每一个字符串是否合法,如果字符串中存在0-9以外的字符,非法,停止判断;如果字符串转换为数字之后超过255,非法,停止判断;

注意事项:

参考代码:

#include <stdio.h>
#include <string.h>
int main()
{
    char s[35];
    int i,k,y,n;
    char *t; 
    while(scanf("%s",s)!=EOF)
    {
        if(strlen(s)>15) //合法的IP地址的字符串不会超过15位 
        {
            printf("N\n");
            continue;
        }
        y=1;
        t=strtok(s,"."); //用.分割字符串 ,分割之后把首地址赋值给t 
        while( t!= NULL )
        {
            n=0; k=1;
            for(i=0;t[i];i++) //判断t是否合法 
            { 
	            if(t[i]>='0' && t[i]<='9')
	                n=n*10+t[i]-'0';
	            else //如果不是数字0-9,则是非法的,不用继续 
	            { 
	                k=0; break;
	            }
	            if(t[0]=='0' && strlen(t)!=1) //如果ip中出现01,或者012这种情况,则是不合法的 
				{
					k=0;break;
				} 
            } 
            if(k==0 || n>255) //如果t中的字符是非法的或者转换为数字超过255,则是非法的,不用继续 
            {
                y=0; break;
            } 
            t=strtok(NULL,"."); //继续用.分割字符串 ,分割之后把首地址赋值给t  
        }
        if(y==1) printf("Y\n");
        else printf("N\n");
    }
    return 0;
}

几个月后,当有人问我这个程序时,哪个写得比较简单时,我看了其他大佬写的程序,写得很好,但是无法判断形如:12.23.123.23a这种不合法的IP,我修改了一下程序,可以判断这种不合法的IP;另外由于宏定义没有加上括号,也无法判断形如:12.-123.23.34,这种不合法的IP,我也做了修改。程序如下:

#include<stdio.h>
#include<stdlib.h>
#define Judge(n) ((n>=0 && n<=255)?1:0)
int main()
{
    char IP[30];
    int a, b, c, d;
    char e; 
    while(scanf("%s",IP) != EOF)
    { 	
		//IP地址按如下格式获取应该获取到4个值,否则不是IP。		
        if(sscanf(IP, "%d.%d.%d.%d%c", &a, &b, &c, &d,&e) == 4)        	
        {   //如果最后一个数字后面还有其他字符,则字符肯定能获取到,并保存到变量e中 
		    //这样sscanf函数返回就应该是5,而不是4了 ,这样可以把不合法的ip去掉,
			// 例如:12.23.34.54a ,这种不合法的IP    
			if(Judge(a) && Judge(b) && Judge(c) && Judge(d))
                printf("Y\n");
            else
                printf("N\n");
        }
        else
            printf("N\n");
    }
    return 0;
}


  评论区