我正在使用snprintf()
编写这样的代码:
char myId[10] = "id123";
char duplicateId[10] = "";
snprintf(duplicateId, 10, myId);
如您所见,我没有明确指定格式说明符%s
。
我是否需要在上述snprintf()
语句中明确指定格式说明符,如snprintf(duplicateId, 10, "%s", myId);
?
答案 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