zoukankan      html  css  js  c++  java
  • snprintf 返回值

    在平时写代码的过程中,我一个推荐带有n系列的字符串函数,如

    strcat ->strncat

    sprintf->snprintf

    我们有类似的一个函数

    void dump_kid(std::string* str, uint32_t kid)
    {
      char buffer[16];
      int len;                                                                                                                  
      if (str->empty())
      {   
        len = snprintf(buffer,sizeof(buffer), "%u", kid);
      }   
      else
      {   
        len = snprintf(buffer,sizeof(buffer), ",%u", kid);
      }   
      str->append(buffer, len);
    }

    我们知道,string的append可以接受没有长度的char*,但这样的效率不高,其内部也会strlen一下。

    所以,在此处我们利用了snprintf的返回值,但查了下,snprintf的返回值有个陷阱。

    snprintf的函数原型为:

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

    说明:

    之前以为snprintf的返回值是实际写入到str字符串的长度,其实不然

    case 1 : 如果要输出的字符串的长度< size, 主要这里不包括=, 因为snprintf会自动将加入到str中,

    snprintf的返回值是实际str的长度

    case 2 : 如果要输出的字符串长度>= size, 则表明str的长度不够写入原有的长度,则snprintf的返回值

    在理想情况下(即str的长度足够长)的字符串长度,所以其返回值可能会出现>= size的情况。

    另外需要说明的snprintf会自动将’′追加到str的末尾,而snprintf的返回值是不包括’′的

    这个在官方的manual里写的比较清楚:

    If the output was truncated due to this limit then the return
    value is the number of characters (not including the trailing ’’) which would have been written to the final string if  enough  space  had  been  available.
    Thus,  a  return value of size or more means that the output was truncated. (See also below under NOTES.)  If an output error is encountered, a negative value
    is returned.

    而sprintf的说明

    On success, the total number of characters written is returned. This count does not include the additional null-character automatically appended at the end of the string.

    成功返回写字符的总数,其中不包括结尾的null字符。
    On failure, a negative number is returned.失败了,返回一个负数。

    但说明情况下返回负数呢?特殊情况下,就会缓冲区溢出了,并不能返回负数?

  • 相关阅读:
    Selenium操作之滚动条
    IntelliJ IDEA代码编码区提示库源不匹配字节码解决办法
    自动化测试浅谈
    json-lib解析json之二维JSONArray
    Java 多态
    Java0基础教程——java的安装
    LAYUI弹出层详解
    ajax实现动态URL
    js serialize()
    TP5.1接入支付宝实现网页/APP支付完整请求回调流程(沙箱环境)
  • 原文地址:https://www.cnblogs.com/westfly/p/3812155.html
Copyright © 2011-2022 走看看