我正在使用以下代码编写这样的代码snprintf()
:
char myId[10] = "id123";
char duplicateId[10] = "";
snprintf(duplicateId, 10, myId);
如您所见,我没有明确指定格式说明符%s
。
snprintf()
我是否需要像这样在上述语句中明确指定格式说明符snprintf(duplicateId, 10, "%s", myId);
?
不,从技术上讲,您不必这样做。但这样做是更好的做法,因为没有常量格式字符串,您的格式字符串仍然是可修改的,因此您的代码将更容易受到格式字符串攻击。
啊,并且也使用sizeof(duplicateId)
而不是常量10
- 也是出于安全原因(为了避免将来在更改 sprintf 的输出缓冲区大小时缓冲区溢出)。
不,你不知道,但它通常被认为是一个好主意,特别是如果有任何机会将用户输入文本传递到snprintf()
. 如果用户输入一个带有 in 的字符串,%
否则会出现问题:
const char *userString = "%";
snprintf(duplicateId, sizeof duplicateIt, userString); /* BAD */
const char *userString = "%s";
snprintf(duplicateId, sizeof duplicateIt, "%s", userString); /* GOOD. */
使用起来会更好,%s
因为它更安全......你没有收到警告吗?也尝试以最高警告级别编译。
在这里阅读更多