题解 | #合法IP#
合法IP
http://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9
应该封装的。
这程序写稀碎。
每次测出一个没通过的测试用例,就针对其增加程序功能。
太离谱了。
不想改了。
反正通过了。
功能描述都在注释里了。
#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);
}