应该封装的。

这程序写稀碎。

每次测出一个没通过的测试用例,就针对其增加程序功能。

太离谱了。

不想改了。

反正通过了。

功能描述都在注释里了。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

char *ip;
int i=0,j=0;
int num=0;
int count=0;
int flag=0;
int len;
int bit_count=0;

int main()
{
    ip=(char*)malloc(sizeof(char));
    scanf("%s\n",ip);
  
    for(i=0;i<strlen(ip);i++)
    {
        if(((*(ip+i)<'0')||(*(ip+i)>'9'))&&((*(ip+i)!='.')))//去除非数字和“.”的符号,比如“+”“-”
        {
            break;
        }
        
        bit_count=0;//每一组数的位数
        
        while((*(ip+i)>='0')&&(*(ip+i)<='9'))//计算每一组地址的具体大小
        {                                    //不遇到非数字,一直访问数字
            num=num*10+*(ip+i)-'0';//按位计算具体大小,每次涨一位
            i++;//指针移动
            flag++;//记录数字个数
            bit_count++;//记录每组地址的位数
            
        }
       
      if((pow(10,(bit_count-1))>num)&&(num!=0))//用于去除0开头的地址,如“01.8.69.3”
        {                                      //如果有0开头,计算出的具体大小的位数
                                               //和地址中数字的位数不同,以10^(位数)作比较
            break;
        }
        
        if(num>255)//用于去除地址超过255的情况
        {
           // printf("NO");
            break;
        }
        else
        {
         //i++;
         count++;//记录“.”的个数
         num=0;//复位每一组数的具体大小
        }
    }
    if((count!=4)||(flag<4))//长度不对的("."的个数不对的,数字个数太少的)输出NO
    {
        printf("NO");
    }
   else if((i==(strlen(ip)+1))&&(strlen(ip)>=7))//有效的地址,长度至少是7,指针最终移动的距离应当是完整长度+1
                                                //(前面的子功能在访问后+1导致)
    {
        printf("YES");
    }
    
    free(ip);
}