解题思路:
----------------------------------------------
每个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 人评分
2005年春浙江省计算机等级考试二级C 编程题(3) (C语言代码)浏览:417 |
C语言训练-大、小写问题 (C语言代码)浏览:2422 |
九宫重排 (C++代码)浏览:2195 |
大神老白 (C语言代码)浏览:690 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:1090 |
C语言程序设计教程(第三版)课后习题6.11 (C语言代码)浏览:566 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)from DQM浏览:773 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:904 |
Tom数 (C语言代码)浏览:517 |