zoukankan      html  css  js  c++  java
  • 【转】snprintf()函数使用方法

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

      注:sprintf()函数:int sprintf( char *buffer, const char *format, [ argument] … );返回的是实际写入buffer的长度

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

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

    函数说明

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

    函数返回值

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

      注:这里返回的长度是格式化数据的长度

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

      之前有个同事这样写的:

    char a='a';
    char str[20];
    snprintf(str,2,"%02x",a);//字符a的十六进制是61

      对不对呢,错了。

      1)2不应该是2,应该是3。

      2)也不建议直接写3,应该写sizeof(str)

       注:sizeof包含求字符串长度时,包含最后的结束符''

      所以建议的写法是:

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

      解释如下

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

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

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

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

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

    运行结果

    10|1234

    Linux和windows下是不同的

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

  • 相关阅读:
    01矩阵扩展
    蒙特卡罗仿真
    某幂相关数学结论
    分式乘法变加减
    ICPC模板排版工具
    windows下mysql使用实录
    随机题目小结
    工作用linux命令汇总
    小数化分数的O(log2n)解法
    博弈总结
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/7296182.html
Copyright © 2011-2022 走看看