解题思路:用字符串分割函数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; }
0.0分
4 人评分
涨知识了
菜菜超努力 2019-11-30 17:53:35 |
前导0无法排除
pingfan443 2019-12-29 17:23:08 |
题目也说了,不允许有前导0存在,要不然就复杂了
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:635 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:807 |
点我有惊喜!你懂得!浏览:1439 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:511 |
回文串 (C语言代码)浏览:3097 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:639 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:2121 |
杨辉三角 (C语言代码)浏览:505 |
矩阵的对角线之和 (C语言代码)浏览:1401 |
C二级辅导-统计字符 (C语言代码)浏览:695 |