算法题:判断字符串是否为 ipv4 地址

简介: 算法题:判断字符串是否为 ipv4 地址
#include <stdio.h>

typedef char bool;
#define true 1
#define false 0


/**

   1.判断字符串是否形如“192.168.1.1”

   2.字符串两端含有空格视为合法ip,形如“    192.168.1.1    ”

   3.字符串中间含有空格视为非法ip,形如“192.168. 1.2”

   4.字符串0开头视为不合法ip,形如192.168.01.1

   5.字符串0.0.0.0视为合法ip
 */

bool checkIpv4(const char *ip){
    printf("检验对象是:%s\n", ip);
    if(NULL == ip) {
        return false;
    }
    const char *q = ip;     //字串指针
    unsigned short int s = 0, count = 0, digitNumber = 0;  //s是字串转化为的整型,count是 . 的个数, digitNumber 是 . 之间的数量
    bool hasZero = false;
    // 开头有空格
    while(' ' == *q) {
        q++;
    }

    while('\0' != *q) {
        if('.' == *q) {
            // . 前面没有任何值,则非法
            if(digitNumber == 0) {
                return false;
            }
            s = 0;
            digitNumber = 0;
            count++;

            hasZero = false;

            q++;

            continue;
        }

        // 值非法
        if(*q < '0' || *q > '9') {
            // 结尾空格
            if(' ' == *q && 3 == count) {
                const char *qq = q;
                while(' ' == *qq) {
                    qq++;
                }
                return '\0' == *qq;
            } else{
                return false;
            }
        }

        int x = *q - '0';
        s = s*10 + x;

        // 0.0.0.0 合法, 00.0.0.0 不合法
        if(0 == s) {
            if(hasZero) {
                return false;
            } else{
                hasZero = true;
            }
        }

        if(s > 255) {
            return false;
        }
        digitNumber++;
        q++;
    }
    return (3 == count);
}

int main(void){
    {
        const int count = 10;
        char *ip[count] = {"0.0.0.0", "255.255.255.255", "0.10.0.0", " 1.1.1.1", "1.1.1.1 ", " 1.1.1.1 "};
        for(int i = 0; i < count; i++) {
            if(checkIpv4(ip[i]))
                printf("该地址是IPv4地址\n");
            else
                printf("该地址不是IPv4地址\n");
        }
    }
    printf("\n\n");
    {
        const int count = 10;
        char *ip[count] = {"1.1.1. 1", "1..2.3", "00.1.1.1", "a.1.1.1", };
        for(int i = 0; i < count; i++) {
            if(checkIpv4(ip[i]))
                printf("该地址是IPv4地址\n");
            else
                printf("该地址不是IPv4地址\n");
        }
    }
    return 0;
}
相关文章
|
4月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
2月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
89 1
两个字符串匹配出最长公共子序列算法
|
4月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
5月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
283 1
|
5月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
123 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
4月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
85 0
|
6月前
|
存储 算法 NoSQL
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
163 1
|
6月前
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
6月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
5月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用