华为笔试机试题,如何判断一个IP地址是否合法?

题目:判断输入的字符串是不是一个有效的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$ 


                                                      
                                                             





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值