解题思路:

----------------------------------------------

每个IP字段不允许前导为0

每个IP字段不允许出现负号

如果每个IP字段第一位不是数字则判定N

如果每个IP字段不属于0~255则判定N

---------------------------------------------


参考代码:


解法一:

#include<stdio.h>

int main(void)

{

    char s[30];

    while(scanf("%s",s)!=EOF)

    {

        int i,j=0;

        for(i=0;s[i]!='\0';i++)

        {

            int sum = 0;//记录每个IP字段总大小

            if(s[0]=='0'&&s[1]!='.')break;//判定第一个字段前导为0时

            if(s[i]<'0'||s[i]>'9')//大前提每个字段第一位数必须是0~9之内

                 {break;  }

           else{

                    while(s[i]!='.'&&s[i])//小前提当前字符不是小数点且字符为0~9时

                    {

                        sum = 10*sum+s[i] - '0';//转换数字并累加

                           i++;

                     }

                if(s[i]=='.'&&s[i+1]=='0'&&s[i+2]!='.')break;//判定后三个字段前导为0时

                if(sum>=0&&sum<=255){j++;}//记录符合条件的字段

                  }

            }

if(j==4)printf("Y\n"); //如果四个字段都正确,则输出Y

else printf("N\n");

    }

}

-------------------------------------------------------------------------------

解法二:

bug:无法判断前导0

#include <stdio.h>

#include <string.h>

#define p(n) (n>=0 && n<=255)       //定义带参数的宏

int main(void)

{    char x[31];

    int a,b,c,d,e;//结合sscanf返回值特性,使用变量e排除输入第四个小数点判对情况

    while(gets(x)!='\0')

{

        if(sscanf(x,"%d.%d.%d.%d%c",&a,&b,&c,&d,&e)==4)

printf("%c\n",(p(a) && p(b) && p(c) && p(d))?'Y':'N');

else

printf('N\n');

}

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论