2

我正在使用以下代码编写这样的代码snprintf()

char myId[10] = "id123";

char duplicateId[10] = "";

snprintf(duplicateId, 10, myId);

如您所见,我没有明确指定格式说明符%s

snprintf()我是否需要像这样在上述语句中明确指定格式说明符snprintf(duplicateId, 10, "%s", myId);

4

3 回答 3

7

不,从技术上讲,您不必这样做。但这样做是更好的做法,因为没有常量格式字符串,您的格式字符串仍然是可修改的,因此您的代码将更容易受到格式字符串攻击。

啊,并且也使用sizeof(duplicateId)而不是常量10- 也是出于安全原因(为了避免将来在更改 sprintf 的输出缓冲区大小时缓冲区溢出)。

于 2012-08-29T06:53:06.553 回答
2

不,你不知道,但它通常被认为是一个好主意,特别是如果有任何机会将用户输入文本传递到snprintf(). 如果用户输入一个带有 in 的字符串,%否则会出现问题:

const char *userString = "%";
snprintf(duplicateId, sizeof duplicateIt, userString);  /* BAD */

const char *userString = "%s";
snprintf(duplicateId, sizeof duplicateIt, "%s", userString);  /* GOOD. */
于 2012-08-29T06:53:06.717 回答
2

使用起来会更好,%s因为它更安全......你没有收到警告吗?也尝试以最高警告级别编译。

在这里阅读更多

于 2012-08-29T06:55:21.247 回答