题目:判断输入的字符串是不是一个有效的IP地址
详细描述:
请实现如下接口
boolisIPAddressValid(constchar* pszIPAddr)
输入:pszIPAddr 字符串
输出:true 有效的IP地址,false,无效的IP地址
约束
输入IP为XXX.XXX.XXX.XXX格式
字符串两端含有空格认为是合法IP
字符串中间含有空格认为是不合法IP
类似于 01.1.1.1, 1.02.3.4 IP子段以0开头为不合法IP
子段为单个0 认为是合法IP,0.0.0.0也算合法IP
我的个人理解:
//检查IP地址的有效性
int ipCheck(char *ip)
{
int i = 0, j = 0, subIP[4], preFlag = -1;
subIP[0] = subIP[1] = subIP[2] = subIP[3] = -1;
for (; i < strlen(ip); i++)
{
//符号判断
if ((ip[i] > '9' || ip[i] < '0') && ip[i] != '.')
{
return -1;
}
//第一位字符判断
if (i == 0 && (ip[i] == '0' || ip[i] == '.'))
{
return -2;
}
//获取分段
if ('.' == ip[i])
{
//防止1..1的情况
if (i == (preFlag+1))
{
return -3;
}
else
{
char acIP[4] = {0,};
memcpy(acIP, ip+preFlag+1, i-preFlag-1);
preFlag = i;
subIP[j++] = atoi(acIP);
//最后一段
if (j == 3)
{
memset(acIP, 0, sizeof acIP);
memcpy(acIP, ip+preFlag+1, strlen(ip)-preFlag-1);
subIP[j] = atoi(acIP);
break;
}
}
}
}
//判断值
for (i = 0; i < 4; i++)
{
if (subIP[i] < 0 || subIP[i] > 255)
{
return -4;
}
}
return 0;
}
代码实现:
#include<stdio.h>
#include<string.h>
#include<memory.h>
int main()
{
char ip[20];
printf("请输入一个ip地址:\n")
gets(ip);
int i=0,j=0;
char subIP[4];
int preFlag=-1;
char acIP[4]={0,};
subIP[0]=subIP[1]=subIP[2]=subIP[3]=-1;
for(;i<strlen(ip);i++)
{
// 符号判断
if((ip[i] > '9' || ip[i] < '0') && ip[i] != '.')
{
printf("false1111\n");
return 0;
}
//第一位字符判断
if(i==0 && (ip[i]=='0' || ip[i]=='.'))
{
printf("false2\n");
return 0;
}
//获取分段
if('.'==ip[i])
{
//防止1..1的情况
if(i==(preFlag+1))
{
printf("false3\n");
}
else
{
// char acIP[4]={0,};
memcpy(acIP,ip+preFlag+1,i-preFlag-1);
preFlag=i;
subIP[j++]=atoi(acIP);
//最后一段
if(j==3)
{
memset(acIP,0,sizeof(acIP));
memcpy(acIP,ip+preFlag+1,strlen(ip)-preFlag-1);
subIP[j]=atoi(acIP);
printf("%s\n",subIP);
printf("the ip is true\n");
return 0;
}
}
}
}
for(i=0;i<4;i++)
{
if(subIP[i]<0 || subIP[i] > 255)
{
printf("false 44");
return 0;
}
}
}
执行结果:
liuzj@ET302Buildver:~/zhanghong$ ./a.out
192.168.1.10
the ip is true
liuzj@ET302Buildver:~/zhanghong$