snprintf和sprintf解释

时间:2011-09-21 19:27:37

标签: c string-formatting printf

有人可以向我解释这个简单程序的输出:

#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 i don't have 2 here?

感谢。

5 个答案:

答案 0 :(得分:28)

因为snprintf需要字符串的\ 0终止符的空格。因此,如果你告诉它缓冲区是1个字节长,那么'2'没有空间。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

snprintf的第二个参数是要写入数组的最大字节数(charArrayAgain)。它包括终止'\0',所以当大小为1时,它不会写一个空字符串。

答案 4 :(得分:2)

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