2013-04-02 39 views
3

这是用C我的代码片段:]为什么不在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

为什么会这样呢?

+1

请[不要在C](http://stackoverflow.com/a/605858/28169)中投射'malloc()'的返回值。 – unwind

回答

11

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

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

cplusplus.com

如果得到的字符串将长于N-1字符,则剩余字符将被丢弃并且不会被存储,但会被计数为该函数返回的值 。

终止空字符会自动附加在 内容之后。

+1

是的。这个答案是正确的,将在6分钟后被接受。 “你可以在6分钟内接受答案”。 –

0

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

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