解题思路:
把输入的IP地址分成四个部分,如:IP:a[ ] . b[ ] . c[ ] . d[ ];
每一部分对应的长度定义为alen,blen,clen,dlen;
每一部分对应的数值定义为anum,bnum,cnum,dnum;
把输入的IP地址,根据上面的分法,以字符' . '为划分界限,分别存进a[ ] . b[ ] . c[ ] . d[ ];
(注意到最后一部分b[ ]时,因为没有' . '为划分界限,所以应该根据是否遍历到IP的最后来结束循环;
做好划分后,就根据以下准则判断是不是合法的IP地址:
大前提,IP的长度不可以超过15,如果超过15,输出N并返回,后面的判断就不用做了,省了很多时间;
在这个时候分段a[ ] . b[ ] . c[ ] . d[ ];(别放在1之前,1这个准则不需要分段判断,知道长度即可,这样可减少不必要的代码执行)
如果a[ ] . b[ ] . c[ ] . d[ ]四个部分中,有一个部分的第一位为负号' - ',输出N并返回,后面的判断就不用做了;
通过了以上两个大条件,那么判断每一部分是否合法:
(1):该部分不能出现除数字字符以外的字符,出现则输出N并返回,后面的几部分的判断就不用做了;
(2):没有出现字符,转换成对应的数字anum,bnum,cnum,dnum,看是否在合法范围内,不在合法范围,输出N并
返 回,后面的几部分的判断就不用做了;
5.若上面的所有都通过,没有中途返回,这输出Y,结束;
以上从1 到5,条件越来越具体化,越来越苛刻,在这些过程中就可以排除大量不合法的IP,减少代码执行量;
注意事项:
参考代码:
#include<stdio.h> #include<string.h> char a[4],b[4],c[4],d[4],IP[30]; int alen=0,blen=0,clen=0,dlen=0,i=0; void panduan(char *IP); void fenduan(); /*=================================================*/ int main() { while(scanf("%s",IP)!=EOF) { panduan(IP); } return 0; } /*=================================================*/ void fenduan() { int lenIP=strlen(IP); int i=0; alen=0,blen=0,clen=0,dlen=0; /*-------------------------*/ while(IP[i]!='.') { a[alen]=IP[i]; alen++; i++; } i++; /*-------------------------*/ while(IP[i]!='.') { b[blen]=IP[i]; blen++; i++; } i++; /*-------------------------*/ while(IP[i]!='.') { c[clen]=IP[i]; clen++; i++; } i++; /*-------------------------*/ while(i<lenIP) { d[dlen]=IP[i]; dlen++; i++; } } /*=================================================*/ void panduan(char *IP) { if(strlen(IP)>15) {printf("N\n");return ;} else /*------------------------------------*/ { fenduan(); int anum=0,bnum=0,cnum=0,dnum=0; if(a[0]=='-'||b[0]=='-'||c[0]=='-'||d[0]=='-') {printf("N\n");return ;} else { /*------------------------------------*/ for(int j=0;j<alen;j++) { if(a[j]>='0'&&a[j]<='9') anum=anum*10+(a[j]-'0'); else {printf("N\n");return ;} } if(anum>255) {printf("N\n");return ;} /*------------------------------------*/ for(int j=0;j<blen;j++) { if(b[j]>='0'&&b[j]<='9') bnum=bnum*10+(b[j]-'0'); else {printf("N\n");return ;} } if(bnum>255) {printf("N\n");return ;} /*------------------------------------*/ for(int j=0;j<clen;j++) { if(c[j]>='0'&&c[j]<='9') cnum=cnum*10+(c[j]-'0'); else {printf("N\n");return ;} } if(cnum>255) {printf("N\n");return ;} /*------------------------------------*/ for(int j=0;j<dlen;j++) { if(d[j]>='0'&&d[j]<='9') dnum=dnum*10+(d[j]-'0'); else {printf("N\n");return ;} } if(dnum>255) {printf("N\n");return ;} /*------------------------------------*/ printf("Y\n"); } } }
0.0分
22 人评分
题目还规定不能出现前导0的情况呀,运行了答主的代码后发现001.002.003.04输出的结果也是Y 是不是漏了一步判断呢
ξ阿东ξ 2020-03-05 14:14:11 |
在int anum=0,bnum=0,cnum=0,dnum=0;后面插入if((a[0]=='0'&&alen!=1)||(b[0]=='0'&&blen!=1)||(c[0]=='0'&&clen!=1)||(d[0]=='0'&&dlen!=1)) {printf("N "); return ; } 可以解决你的问题
日暮途远 2020-04-23 18:32:10 |
题目说了,为了简单规定不能这样输入,就是说我们做题时不用考虑这种情况,不考虑这种情况编出来的程序系统也能过。
你好,我想问一下为什么函数fenduan没有把数组IP传递过去但是也能够直接用IP?
Dazai 2018-11-24 18:52:31 |
sorry, 刚刚没看清楚是全局的
【绝对值排序】 (C语言代码)浏览:832 |
矩阵乘法 (C++代码)浏览:1662 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:690 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:584 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:942 |
WU-字符串比较 (C++代码)浏览:824 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:1482 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:897 |
母牛的故事 (C语言代码)浏览:739 |
模拟计算器 (C++代码)浏览:885 |