判断一个字符串是否是IPv4(不能用字符串函数)。
首先我们判断字符串的长度是否大于6且小于16,然后根据字符 ‘.’ 逐个划分字符串;
其次判断每个划分的长度是否大于0且小于4;
然后判断每个划分中每个字符是否大于等于字符‘0’且小于等于字符‘9’;
最后把每个划分转化成整数,判断其是否大于等于0且小于等于255。
如果上述判断全都为”是“则该字符串是ipv4,只要有一个为”否“则不是ipv4。
下面是代码:
#include<stdio.h>
#define true 1
#define false 0
int isIpv4(char * , int begin , int end);
int main()
{
char p[20];
scanf("%s" , p);
char *ch , *q;
ch = q = p;
int length=0;
while(*(q+length)!='\0')length++;
if(7 > length || 15 < length)
{
printf("is not ipv4!\n");
return 0;
}
int i , k=0 , m=0;
for(i = 0 ; i < length ; i++)
{
while(*q!='\0' && *q!='.')
{
k++; q++;
}
if(0 == isIpv4(ch , i , k))
{
printf("is not ipv4!\n");
return false;
}
i = k;
if(*q!='\0') q++;
k++;
m++;
}
if(4 != m) printf("is not iPv4!\n");
else printf("is iPv4!\n");
return 0;
}
int pow(int n , int m)
{
int k = 1;
while(m--) k*=10;
return k;
}
int isIpv4(char *ch , int begin , int end)
{
if(end-begin<=0 || end-begin>3) return false;
int i,a = 0;
for( i = begin ; i<end ; i++)
{
if(ch[i]<'0'||ch[i]>'9') return false;
a += (ch[i]-'0')*pow(10,end-i-1);
}
if(a<0||a>255) return false;
return true;
}
上述代码可能存在缺陷,希望发现的读者能够指出。如果读者有更好的方法,希望读者能分享出来。