• snprintf()函数使用方法


    众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf.

    自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下:

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

    函数说明:

    最多从源串中拷贝size1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为size的话,将不会溢出。

    函数返回值:

    若成功则返回欲写入的字符串长度,若出错则返回负值。


    但是大家在使用snprintf的时候是否真的清楚参数里size的意思呢?看下面的例子:
    假设我想将一个char类型的变量打印成2进制,我应该怎么写呢?

    之前有个同事这样写的:

    char a='a';
    char str[20];
    snprintf(str,2,"%02x",a);

    对不对呢,错了。
    1). 2不应该是2,应该是3.
    2). 也不建议直接写3,应该写sizeof(str)

    所以建议的写法是:

    char a='a';
    char str[3];//再大点也没有问题
    snprintf(str,sizeof(str),"%02x",a);

    解释如下:
    size是限定最终生成的dest的字符数,最多拷贝size-1个字符; 一般情况下size会取sizeof(dest),这是为了dst不溢出.

    在snprintf(dest, size, "str: %s\n", src)中如果size-1大于等于"str: %s\n"的长度,则把"str: %s\n"都拷贝到dst; 如果size-1小于"str: %s\n"的长度,则从"str: %s\n"拷贝size-1长度的字符串到dst,并且末尾置\0.

    就是说,拷贝的长度是size-1和源字符串长度的最小值;

    对于返回值,需要注意的是snprintf的返回值欲写入的字符串(即源字符串长度,而不是实际写入的字符串度。如:

    char test[8];int ret= snprintf(test,5,"1234567890"); printf("%d|%s\n",ret,test);

    运行结果为:
    10|1234


    linux和windows下是不同的

    linux下用的是snprintf();
    而windows下用的是_snprintf();

    原文地址:http://www.vimer.cn/2009/11/snprintf%E5%AE%B9%E6%98%93%E8%AF%AF%E8%A7%A3%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html


  • 相关阅读:
    被学长教会的高斯消元法Gauss
    KMP字符串匹配算法翔解❤
    fkwの题目(祝松松生日快乐!)
    NOI-linux下VIM的个人常用配置
    从2017年暑假到现在手打的模板↑_↑
    【テンプレート】初级数据结构
    【テンプレート】高精
    DP(第二版)
    luogu P1029 最大公约数和最小公倍数问题
    贪心题整理
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218626.html
Copyright © 2020-2023  润新知