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