snprintf和sprintf的解释

13

有人能解释一下这个简单程序的输出吗?

#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?
5个回答

31

由于snprintf需要为字符串的\0终止符留出空间。因此,如果您告诉它缓冲区长度为1个字节,则没有足够的空间来存储“2”。

请尝试使用snprintf(charArrayAgain, 2, "%d", number);


1
你觉得用 2 代替,改成用 sizeof(charArrayAgain) 怎么样? - indiv
8
同意,sizeof(charArrayAgain)更好一些——虽然通常你拥有的是一个指针而不是一个数组,在这种情况下,sizeof()不能正常工作。 - Malcolm Box

5
snprintf(charArrayAgain, 1, "%d", number);
//                       ^

您正在将最大缓冲区大小指定为一个字节。然而,要在字符串中存储一个数字,您必须有两个字节(一个用于数字,一个用于空终止符)。


4
您已经告诉 snprintf 只将单个字符打印到数组中,这不足以容纳转换后的字符串数字(一个字符)和字符串终止符 \0(第二个字符),因此 snprintf 无法将字符串存储到您提供的缓冲区中。

4
< p > snprintf 的第二个参数是要写入数组(charArrayAgain)的最大字节数。它包括终止符 '\0',所以如果大小为 1,则不会写入空字符串。


2

检查snprintf()的返回值,它可能是2。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接