解题思路:
----------------------------------------------
每个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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复