【问题标题】:snprintf and sprintf explanationsnprintf 和 sprintf 解释
【发布时间】:2011-09-21 19:27:37
【问题描述】:

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

#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


    【解决方案1】:

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

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

    【讨论】:

    • 2代替sizeof(charArrayAgain)怎么样。
    • 同意,sizeof(charArrayAgain) 会更好 - 尽管通常你有一个指针而不是数组,在这种情况下 sizeof() 不起作用。
    【解决方案2】:
    snprintf(charArrayAgain, 1, "%d", number);
    //                       ^
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2011-11-11
            • 1970-01-01
            • 1970-01-01
            • 2014-07-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-09
            相关资源
            最近更新 更多