没有格式说明符的snprintf()?

时间:2012-08-29 06:51:05

标签: c printf

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

char myId[10] = "id123";

char duplicateId[10] = "";

snprintf(duplicateId, 10, myId);

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

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

3 个答案:

答案 0 :(得分:7)

不,技术上你没必要。但这样做更好,因为没有常量格式字符串,您的格式字符串仍然可以修改,因此您的代码更容易格式化字符串攻击。

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

答案 1 :(得分:2)

不,不,但通常认为这是一个好主意,特别是如果有可能将用户输入的文本传递给snprintf()。如果用户输入了包含%的字符串,则会出现问题:

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

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

答案 2 :(得分:2)

最好使用%s,因为它更安全......你不会收到警告吗? 尝试在最高警告级别编译。

了解更多here