有人可以解释这个简单程序的输出吗?
#include <stdio.h>
int main(int argc, char *argv[])
{
char charArray[1024] = "";
char charArrayAgain[1024] = "";
int number;
number = 2;
sprintf(charArray, "%d", number);
printf("charArray : %s\n", charArray);
snprintf(charArrayAgain, 1, "%d", number);
printf("charArrayAgain : %s\n", charArrayAgain);
return 0;
}
输出为:
./a.out
charArray : 2
charArrayAgain : // Why isn't there a 2 here?
因为snprintf需要空间作为字符串的终止符。因此,如果你告诉它缓冲区的长度是 1 个字节,那么就没有空间容纳“2”。
尝试使用
snprintf(charArrayAgain, 2, "%d", number);
snprintf(charArrayAgain, 1, "%d", number);
// ^
您将最大缓冲区大小指定为一字节。但是,要在字符串中存储单个数字,您必须有两个字节(一个用于数字,一个用于空终止符。)
您已经告诉
snprintf
仅将单个字符打印到数组中,这不足以容纳字符串转换后的数字(即一个字符)和字符串终止符(这是第二个字符),因此 snprintf 无法将字符串存储到您给定的缓冲区中。
snprintf
的第二个参数是要写入数组的最大字节数(charArrayAgain
)。 它包括终止符 '\0'
,因此大小为 1 时不会写入空字符串。
检查 snprintf() 的返回值,它可能是 2。
直接来自 cplusplus 文档
snprintf 用与 printf 上使用 format 相同的文本组成一个字符串,但内容不是被打印,而是以 C 字符串形式存储在 s 指向的缓冲区中(以 n 为最大缓冲区容量来填充) ).
如果生成的字符串长度超过 n-1 个字符,则剩余字符将被丢弃且不存储,但会计入函数返回的值。
写入内容后会自动附加一个终止空字符。
在格式参数之后,函数至少需要格式所需的附加参数。