题解 | #合法IP#
合法IP
http://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9
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");
}
}