笔试题目“检测IPv4地址”的实现

简介:

网友的力量是强大的,昨天发了一篇Post,关于一道面试/笔试题。得到网友们的众多解决方法。我不得不承认自己写的代码是如此的烂。尽管如此,也是很有必要和大家一起来探讨,也有必要写出自己心中所想。这样才有进步,才有改变,才能将自己的烂代码优化。接着发一段烂代码,希望学习网友们更加优美,优秀的代码。

笔试题目

判断一个字符串是否是IPv4地址。如果是返回ture,否则返回false。同样不可以使用库函数。可以选择用C/C++,C#或者Java。

e.g.  C/C++:  bool checkIPv4(char * ip){}

 

解决方法

鄙人是这样想的,按照‘.’先将每个字串分割出来。如“192.168.203.70”分割为192,168,203,70四个整型。然后再判断这四个整型的范围,是否在0~255之间。我总觉得这种考虑欠妥,应该选择类似正则表达式那样的方法吧。但是不会写。。。

一开始我是这样写的。

检查IPv4

 

但是很明显是有问题的。

当检验“192.168.203.70”的时候,结果是可以的。

但是当检验的对象不是数字的时候,例如“a.168.203.70”,居然也可以验证通过,欠考虑了。

所以在切割出来的每个整型,我再检查了一遍每个整型是否在0~9范围内,不是的话返回false。

 if(x<0||x>9)        //判断x是否在0~9之间
      return false;

感谢网友zdd的提醒,确实没有考虑到类型“1...3”出现连续点的情况。果然自己写的东西够烂的。我是这样处理的:

出现这样的情况是因为

s=0;

            for(int j=1;j<=i;j++)   //将切割出来的字串变成整型
            {
                int x=*q-'0';       //字符减'0'变为整型
                if(x<0||x>9)        //判断x是否在0~9之间
                    return false;

                for(int k=1;k<j;k++)    //第几位乘以几-1个10.
                    x*=10;
                s+=x;
                q--;
            }

里面的for循环会发生不执行的情况,所以就不处理类似“1...3”出现连续点的情况了。我改变代码如下
s=0;
            int x=-1;
            for(int j=1;j<=i;j++)   //将切割出来的字串变成整型
            {
                x=*q-'0';       //字符减'0'变为整型
                if(x<0||x>9)        //判断x是否在0~9之间
                    return false;

                for(int k=1;k<j;k++)    //第几位乘以几-1个10.
                    x*=10;
                s+=x;
                q--;
            }

            if(x==-1)
                return false;//防止类型“1...3”出现连续点的情况

将x放在for循环外面,用来检测是否出现连续个点的情况。

下面是完整的代码

 

#include <stdio.h>

bool checkIpv4(char * ip)
{
    printf("检验对象是:%s\n",ip);
    char *p=ip;     //遍历指针
    char *q=ip;     //字串指针
    int i=0,s,count=0;  //i是每个字串的长度,s是字串转化为的整型,count是字串的个数

    if(*p=='.') //处理特殊情况
        return false;

    while(*p!='\0') //遍历每个字符
    {
        if(*p=='.'||*(p+1)=='\0')   //根据'.'将字符串切割出来,最后一个字串根据'\0'识别
        {
            count++;            //计算切割的字串个数

            if(*(p+1)=='\0')    //处理最后一个字串,‘\0’识别的时候
            {
                i++;
                q=p;
            }
            else
                q=p-1;  //‘.切割’

            s=0;
            int x=-1;
            for(int j=1;j<=i;j++)   //将切割出来的字串变成整型
            {
                x=*q-'0';       //字符减'0'变为整型
                if(x<0||x>9)        //判断x是否在0~9之间
                    return false;

                for(int k=1;k<j;k++)    //第几位乘以几-1个10.
                    x*=10;
                s+=x;
                q--;
            }

            if(x==-1)
                return false;//防止类型“1...3”出现连续点的情况

            printf("%d\n",s);
            if(s<0||s>255)      //判断切割出来的字串是否在ipv4范围内
                return false;
            i=0;
        }
        else
        {
            i++;
        }
        p++;
    }
    if(count==4)    //检查是否是四个字串
        return true;
    else
        return false;
}

int main(void)
{
    char ip[]="1..2.3";
    if(checkIpv4(ip))
        printf("该地址是IPv4地址\n");
    else
        printf("该地址不是IPv4地址\n");
    return 0;
}


 

解释应该挺清楚的了。这个时候只要切割出来的字符不在0~9范围内,都不会通过。

 

相信有更好的解决方法,求共勉之。。。。

相关文章
|
Java 数据安全/隐私保护 Sentinel
面试官:Sentinel是如何实现限流的?
面试官:Sentinel是如何实现限流的?
1602 1
|
网络协议 数据安全/隐私保护 网络虚拟化
深入了解OSI模型:计算机网络的七大层次
OSI模型 OSI模型是一个网络通信的概念模型,用于描述计算机网络中各个不同层次之间的通信和功能。它将网络通信分为七个不同的层次,每个层次负责不同的任务,使得网络通信的设计、开发和管理更加模块化和可维护。以下是OSI模型的七个层次以及它们的主要功能: 1、物理层(Physical Layer): 功能:处理物理传输介质上的原始比特流,确保数据在传输媒体上能够以适当的方式传输。 示例设备:集线器、中继器、网线等。 主要任务:比特编码、电压规范、物理拓扑等。 2、数据链路层(Data Link Layer): 功能:负责将原始比特流分割成帧并添加地址信息,以便在直接连接的设备之间传输数据。 示例设
3603 0
|
存储 安全 Java
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
|
Shell Linux Python
基于远程服务器安装配置Anaconda环境及创建python虚拟环境详细方案(一)
基于远程服务器安装配置Anaconda环境及创建python虚拟环境详细方案
7417 0
基于远程服务器安装配置Anaconda环境及创建python虚拟环境详细方案(一)
|
SQL 关系型数据库 MySQL
|
SQL 数据采集 JSON
使用对比!SLS 数据加工 SPL 与旧版 DSL 场景对照
本文讨论在不同的数据处理需求中,新版数据加工 SPL 与旧版数据加工 DSL 的使用对照。
7764 96
|
12月前
|
IDE iOS开发 Python
小白如何开始使用通义灵码(含安装IDE、安装灵码插件)
PyCharm 和 IntelliJ IDEA 下载安装及通义灵码插件下载安装说明
10014 9
|
C语言
C语言取整方法详解
C语言取整方法详解
3110 0
|
Java
== 和 equals 有什么区别?
本文解释了在Java中,"=="用于比较基本数据类型的值或引用类型的引用是否相等,而"equals"默认也是比较引用,但常常被重写为比较对象的值是否相等,例如在String和Integer类中,并且提供了如何自定义"equals"方法的示例。
409 0
== 和 equals 有什么区别?
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 IN
【8月更文挑战第12天】
994 0
在 MySQL 中使用 IN