snprintf 和 sprintf 解释

问题描述 投票:0回答:6

有人可以解释这个简单程序的输出吗?

#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?
c string-formatting printf
6个回答
32
投票

因为snprintf需要空间作为字符串的终止符。因此,如果你告诉它缓冲区的长度是 1 个字节,那么就没有空间容纳“2”。

尝试使用

snprintf(charArrayAgain, 2, "%d", number);


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

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


4
投票

您已经告诉

snprintf
仅将单个字符打印到数组中,这不足以容纳字符串转换后的数字(即一个字符)和字符串终止符(这是第二个字符),因此 snprintf 无法将字符串存储到您给定的缓冲区中。


4
投票

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


2
投票

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


0
投票

直接来自 cplusplus 文档

snprintf 用与 printf 上使用 format 相同的文本组成一个字符串,但内容不是被打印,而是以 C 字符串形式存储在 s 指向的缓冲区中(以 n 为最大缓冲区容量来填充) ).

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

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

在格式参数之后,函数至少需要格式所需的附加参数。

© www.soinside.com 2019 - 2024. All rights reserved.