3

这是我在 C 中的代码片段:

      char *str = NULL;
      int len = -1;

      // Get length
      len = snprintf(NULL, 0, "[%d]", 2);

      // Allocate str
      str = (char *)malloc(len + 1);

      // Assign str
      snprintf(str, len, "[%d]", 2);

      assert(len == 3);

      // Display str
      puts(str);

我希望这应该显示[2]。这len是3。

但运行此代码仅显示[2

为什么会这样?

4

2 回答 2

11

缓冲区的长度是len+1,但你只传递lensnprintf,试试这个:

snprintf(str, len + 1, "[%d]", 2);

来自cplusplus.com

如果结果字符串长于 n-1 个字符,则剩余字符将被丢弃且不存储,但会计入函数返回的值。

内容后会自动附加一个终止空字符。

于 2013-04-02T09:08:56.087 回答
0

函数 snprintf() 最多将 len 个字节(包括终止的空字节 ('\0'))写入 str。

len 等于 3(第一次调用),所以 snprintf 将只写入 3 个字符:'['、'2' 和 '\0'。

于 2013-04-02T09:15:43.613 回答