由于snprintf而尾随零

时间:2015-05-29 10:14:00

标签: c string printf

今天我遇到了一个我无法理解的问题。请考虑以下代码段:

static const char *LOG_MESSAGES[] = {"String1.", "A longer string 2.", "String 3"};

main()函数的某处,我写道:

printf("%s\n", LOG_MESSAGES[1]);//Prints "A longer string 2." as expected.
char rawLog[100] = {0};
printf("%s\n", rawLog);//Prints an empty string as expected.
snprintf(rawLog, 100, LOG_MESSAGES[1]);
printf("%s\n", rawLog);//Prints "A longer string 2.0". Adds a zero at the end.

我可能会遗漏一些obvoius,但这个尾随的零对我来说毫无意义。如果我改变

snprintf(rawLog, 100, LOG_MESSAGES[1]);

snprintf(rawLog, strlen(LOG_MESSAGES[1]), LOG_MESSAGES[1]);
零消失。尽管如此,即使大小为100,snprintf()仍应在LOG_MESSAGES[1]的末尾停止。

这个零来自哪里?

2 个答案:

答案 0 :(得分:3)

编辑:

根据评论中收到的信息,案例1 是这种情况下的问题。

在你的情况下,两者

 snprintf(rawLog, 100, LOG_MESSAGES[1]);                    //..........case 1

snprintf(rawLog, strlen(LOG_MESSAGES[1]), LOG_MESSAGES[1]); //..........case 2

是错误的,考虑到LOG_MESSAGES[1]字符串可能包含某种形式的格式说明符本身。

  • 案例1:您忘记了格式字符串,例如%s
  • 案例2 案例1,另外,您没有编写整个字符串。请记住,strlen() 。您至少需要strlen(LOG_MESSAGES[1]) + 1来编写整个字符串内容以及空终止符。

答案 1 :(得分:2)

纠正

snprintf(rawLog, 100, "%s\n", LOG_MESSAGES[1]);

在您的示例中,您使用LOG_MESSAGES [1]作为格式,而不是要复制到rawlog的文本。