[华为机试练习题]5.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

知识点: 字符串

题目来源: 111

练习阶段: 中级

代码

/*---------------------------------------
*   日期:2015-06-25
*   作者:SJF0115
*   题目:IP地址推断有效性
*   来源:华为上机
-----------------------------------------*/
#include <iostream>
#include <cstring>
using namespace std;

bool isIPAddressValid(const char* pszIPAddr)
{
    if(pszIPAddr == NULL)
    {
        return false;
    }//if
    int size = strlen(pszIPAddr);
    // 去除前导0
    int start = 0;
    while(pszIPAddr[start] == ‘ ‘)
    {
        ++start;
    }//while
    // 去除后导0
    int end = size - 1;
    while(pszIPAddr[end] == ‘ ‘)
    {
        --end;
    }//while
    int num = 0;
    int pointCount = 0;
    int first = start;
    for(int i = start;i <= end+1;++i)
    {
        if(pszIPAddr[i] >= ‘0‘ && pszIPAddr[i] <= ‘9‘)
        {
            num = num * 10 + pszIPAddr[i] - ‘0‘;
        }//if
        else if(pszIPAddr[i] == ‘.‘ || i == end + 1)
        {
            if(i == start || (pszIPAddr[i-1] < ‘0‘ || pszIPAddr[i-1] > ‘9‘))
            {
                return false;
            }
            // 验证.个数
            if(pszIPAddr[i] == ‘.‘)
            {
                ++pointCount;
                if(pointCount > 3)
                {
                    return false;
                }//if
            }//if
            // 验证数据
            if(num > 255 || num < 0)
            {
                return false;
            }//if
            // 以0开头且不为0 比如:023
            if(num != 0 && pszIPAddr[first] == ‘0‘)
            {
                return false;
            }//if
            first = i+1;
            num = 0;
        }//else
        else
        {
            return false;
        }//else
    }//for
    if(pointCount != 3)
    {
        return false;
    }
    return true;
}
时间: 2024-08-08 06:20:49

[华为机试练习题]5.IP地址推断有效性的相关文章

[华为机试练习题]54.判断任意两台计算机的IP地址是否属于同一子网络

题目 描述: 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据. 最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯.就这么简单. 请看以下示例: 运算演示之一: IP地址:192.168.0.1 子网掩码:255.255.255.0 AND运算 转化为二进制进行运算: IP地址:11010000.10101000.00000000.00000001 子网掩码:1111111

[华为机试练习题]34.识别有效的IP地址和掩码并进行分类统计

题目 描述: 请解析IP地址和对应的掩码,进行分类识别.要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类. 所有的IP地址划分为 A,B,C,D,E五类 A类地址1.0.0.0~126.255.255.255; B类地址128.0.0.0~191.255.255.255; C类地址192.0.0.0~223.255.255.255; D类地址224.0.0.0~239.255.255.255: E类地址240.0.0.0~255.255.255.255 私网IP范围是: 10.0

[华为机试练习题]44.24点游戏算法

题目 注意: 6 + 2 * 4 + 10 = 24 不是一个数字一个数字的计算 代码 /*--------------------------------------- * 日期:2015-07-03 * 作者:SJF0115 * 题目:24点游戏算法 * 来源:华为机试练习题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector&

[华为机试练习题]45.求某二进制数中1的个数

题目 描述: 题目标题: 求某二进制数中1的个数. 给定一个unsigned int型的正整数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 详细描述: 原型: int GetCount(unsigned int num) 输入参数: num 给定的正整数 输出参数(指针指向的内存区域保证有效): 无 返回值: 返回1的个数 举例: 输入13,则对应的二进制是1101,那么1的个数为3个.则:返回3. 练习阶段: 初级 代码 /*--------------------

[华为机试练习题]46.计算二进制数的0的个数

题目 描述: 输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算.不需要考虑负数的情况. 题目类别: 位运算 难度: 初级 运行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 要计算的十进制非负数 输出: 二进制中第一个1之后0 的个数 样例输入: 2 样例输出: 1 代码 /*--------------------------------------- * 日期:2015-07-03 * 作者:SJF0115 * 题目:计算二

[华为机试练习题]58.查找同构数的数量

题目 描写叙述: 找出1至n之间同构数的个数. 同构数是这样一组数:它出如今平方数的右边.比如:5是25右边的数.25是625右边的数,5和25都是同构数. 具体描写叙述: 接口说明 原型: intSearchSameConstructNum(int n); 输入參数: int n:查找1至n之间的所有同构数 返回值: int:1至n之间同构数的个数 练习阶段: 0基础 代码 /*--------------------------------------- * 日期:2015-07-05 *

[华为机试练习题]57.对象管理器

题目 代码 /*--------------------------------------- * 日期:2015-07-05 * 作者:SJF0115 * 题目:对象管理器 * 来源:华为机试练习题 -----------------------------------------*/ #include <iostream> #include "ObjMgt.h" #include <vector> using namespace std; struct Ob

[华为机试练习题]1.周期串问题

题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期.例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3).字符串的长度小于等于100,由调用者保证. 接口说明 原型: int GetMinPeriod(char *inputstring); 输入参数: char * inputstring:字符串 返回值: int 字符串最小周期 代码一 /*-----------------------------------

[华为机试练习题]24.删除链表中的反复节点、剩余节点逆序输出

题目 描写叙述: 题目描写叙述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容反复的节点(反复的节点所有删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容反复的节点(反复的节点所有删除).剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]仅仅须要完毕该函数功