Manchester


私信TA

用户名:wenyajie

访问量:331901

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 65524
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
把输入的IP地址分成四个部分,如:IP:a[ ] . b[ ] . c[ ] . d[ ];

每一部分对应的长度定义为alen,blen,clen,dlen;

每一部分对应的数值定义为anum,bnum,cnum,dnum;

把输入的IP地址,根据上面的分法,以字符' . '为划分界限,分别存进a[ ] . b[ ] . c[ ] . d[ ];

(注意到最后一部分b[ ]时,因为没有' . '为划分界限,所以应该根据是否遍历到IP的最后来结束循环;


做好划分后,就根据以下准则判断是不是合法的IP地址:

  1. 大前提,IP的长度不可以超过15,如果超过15,输出N并返回,后面的判断就不用做了,省了很多时间;

  2. 在这个时候分段a[ ] . b[ ] . c[ ] . d[ ];(别放在1之前,1这个准则不需要分段判断,知道长度即可,这样可减少不必要的代码执行)

  3. 如果a[ ] . b[ ] . c[ ] . d[ ]四个部分中,有一个部分的第一位为负号' - ',输出N并返回,后面的判断就不用做了;

  4. 通过了以上两个大条件,那么判断每一部分是否合法:

(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 人评分

  评论区

但是不是要输入"End of file"结束循环吗
2022-01-31 17:11:03
妙啊
2022-01-27 21:01:10
题目还规定不能出现前导0的情况呀,运行了答主的代码后发现001.002.003.04输出的结果也是Y
是不是漏了一步判断呢
2020-02-18 09:27:20
曼联大佬厉害呀
2019-11-22 13:01:49
anum=anum*10+(a[j]-'0');这句话太棒了
2019-01-19 21:39:33

                        
2019-01-10 10:51:28
你好,我想问一下为什么函数fenduan没有把数组IP传递过去但是也能够直接用IP?
2018-11-24 18:49:57
Manchester的解答真是妙啊,尤其是用ASCII的 ’数字‘    -‘0’,受教了。
2018-11-09 09:39:27
  • «
  • 1
  • »