今天我遇到了一个我无法理解的问题。请考虑以下代码段:
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]
的末尾停止。
这个零来自哪里?
答案 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]
字符串可能包含某种形式的格式说明符本身。
%s
。strlen()
中 。您至少需要strlen(LOG_MESSAGES[1]) + 1
来编写整个字符串内容以及空终止符。答案 1 :(得分:2)
纠正
snprintf(rawLog, 100, "%s\n", LOG_MESSAGES[1]);
在您的示例中,您使用LOG_MESSAGES [1]作为格式,而不是要复制到rawlog的文本。