• snprintf用错了快10年…


    1 int snprintf(char *str, size_t size, const char *format, ...);

    从用snprintf开始,size参数一直传的都是buff_size-1,像这样:

     1 int main()
     2 {
     3     char *a = "hello";
     4 
     5     char tmp[5] = {0};
     6 
     7     snprintf(tmp, 4, "%s", a);
     8 
     9     printf("%s
    ", tmp);
    10 
    11     return 0;
    12 }

    最多允许它往缓冲区格式化4个字符;最后一个字符用来做字符串结束标记的;不能动;

    当我跑这段代码时,发现输出的是hel;而我想要它输出的是hell;

    这,我开始怀疑人生了;我记得清清楚楚,当时工作的时候还特意规范大家要写size-1的啊;

    查manpage,然后我竟然有勇气怀疑manpage是不是在哪个时候改过,标准不一样了;哈哈;

    反复试了各种不同长度的格式化,发现我确实错了;

    于是发到第一份工作的群里,甩锅给师父;师父表示,这是啥语言,他不知道;哈哈;

    总结:

    有些自己用了很久的东西,未必是完全正确的,只是恰好没有什么影响而已;通常snprintf也就是用来格式化个字符串,并且缓冲区长度也都比较充足,所以一直以来都没有太注意过这个边界问题;

    大神也有知识的盲区,不能过于相信大神说的话,还要自己小心求证;

    用的不出问题和用的准确之间还有一段距离,用的准确无误是程序员本应该有的责任感;

    吓得我把所有带n版本的字符串操作函数都确认了一遍;

  • 相关阅读:
    .NET实时2D渲染入门·动态时钟
    JAVA中抽象类的使用
    R语言中函数调试
    利用Bioperl的SeqIO模块解析fastq文件
    ASCII码表
    JAVA 中转义符的理解
    在线引物设计网站,老板推荐的,亲测好用
    列出一个买东西的好网站,值得推荐
    R语言集合操作
    R语言do.call 函数用法详解
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11767247.html
Copyright © 2020-2023  润新知