IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

用 sscanf 解析字符串时结尾的判断

chen3feng的专栏 2010-08-02 10:22:38 累计浏览 1,972 次
本机暂存

常用 sscanf 解析字符串,处理错误也很简单:sscanf 会返回实际解析并赋值了的域的个数,判断一下是否和期望的一致即可。

今天却遭遇一个解析地址的 bug,是由于地址本应该是“127.0.0.1:30000”被写成 “127.0.0.1:30000:127.0.0.1:30000”,原来用 sscanf 解析,判断结果等于5就认为正确,却没有判断额外的字符。

修正:

以下是代码片段:
    bool Assign(const char* src)
    {
        unsigned int b1, b2, b3, b4;
        char dummy; // catch extra character 
        int count = sscanf(src, "%u.%u.%u.%u%c ", &b1, &b2, &b3, &b4, &dumm y);
        if (count == 4 && b1 < 256 && b2 < 256 && b3 < 256 && b4 < 256)
        {
            Assign((unsigned char)b1, (unsigned char)b2, (unsigned char)b3, (unsigned char)b4);
            return true;
        }
        return false;
    }

再去额外读一个字符,如果匹配,就是错误。

还有一个方法,就是使用 %n:

以下是代码片段:
    bool Assign(const char* src)
    {
        unsigned int b1, b2, b3, b4;
        int bytes_parsed; // 
        int count = sscanf(src, "%u.%u.%u.%u%n ", &b1, &b2, &b3, &b4, & bytes_parsed );
        if (count == 4 && bytes_parsed == strlen(src) && b1 < 256 && b2 < 256 && b3 < 256 && b4 < 256)
        {
            Assign((unsigned char)b1, (unsigned char)b2, (unsigned char)b3, (unsigned char)b4);
            return true;
        }
        return false;
    }

%n 会把当前读取了多少字节放入 int 类型的结果中。

同分类推荐文章

  1. 科技爱好者周刊(第 401 期):如何赚到10亿美元 (2026-06-26 08:05:38)
  2. 如何做决策 - 从 Go 的一个 issue 说起 (2026-06-26 08:00:00)
  3. Seven Player:Windows上播放115网盘视频的增强工具 (2026-06-09 00:06:47)

查看更多 开发者 文章 →

建议继续学习

  1. 看看各个网站的404错误处理 (累计阅读 10,209)
  2. PHP的异常原理与实例说明 Fatal error: Uncaught exception (累计阅读 9,764)
  3. 从C语言的Hello World说起 (累计阅读 7,646)
  4. 是返回错误码,还是抛出异常?说说我的选择 (累计阅读 7,547)
  5. 为什么C语言需要函数声明 (累计阅读 5,720)
  6. C语言的那些个关键字们 (累计阅读 5,633)
  7. Nginx启动初始化过程(一) (累计阅读 5,557)
  8. PHP内核介绍及扩展开发指南―Extensions 的编写 (累计阅读 5,502)
  9. do{...}while(0)的意义和用法 (累计阅读 5,119)
  10. PHP内核介绍及扩展开发指南―高级主题 (累计阅读 4,665)