1.没有其他字符 2.有且仅有仨点,且不相连,且不出现在两头 3.两位及以上数字不以0开头

#include <stdio.h>
#include<stdbool.h>
#include<ctype.h>
bool valid(char*str){
    int dot[10],dots=0,len=0;
    while(str[len]){
        if(!(str[len]=='.'||isdigit(str[len])))//排除其他字符
            return false;
        if(str[len]=='.'){//记录三个点位
            dot[dots++]=len;
            if(str[len+1]&&str[len+1]=='.')//排除点点相连
                return false;
        }
        len++;
    }
    //len记录长度,dot[]点位信息,dots总点数
    if(!(len>0&&str[0]!='.'&&str[len-1]!='.'&&dots==3)||dot[0]>1&&str[0]=='0'
       ||dot[1]-dot[0]>2&&str[dot[0]+1]=='0'||dot[2]-dot[1]>2&&str[dot[1]+1]=='0'
       ||len-dot[2]>2&&str[dot[2]+1]=='0')
        return false;
    return true;
}
bool numvalid(char*str){
    int n1,n2,n3,n4;
    sscanf(str,"%d.%d.%d.%d",&n1,&n2,&n3,&n4);
    return n1>=0&&n1<256&&n2>=0&&n2<256&&n3>=0&&n3<256&&n4>=0&&n4<256;
}
int main(){
    char str[100];
    while(~scanf("%s",str)){
        printf("%s\n",valid(str)&&numvalid(str)?"YES":"NO");
    }
}