我寫一個這樣的代碼使用snprintf()
:snprintf()沒有格式說明符?
char myId[10] = "id123";
char duplicateId[10] = "";
snprintf(duplicateId, 10, myId);
正如你所看到的,我不是指定格式說明%s
明確。
是否需要顯式指定上述snprintf()
語句中的格式說明符,如snprintf(duplicateId, 10, "%s", myId);
?
我寫一個這樣的代碼使用snprintf()
:snprintf()沒有格式說明符?
char myId[10] = "id123";
char duplicateId[10] = "";
snprintf(duplicateId, 10, myId);
正如你所看到的,我不是指定格式說明%s
明確。
是否需要顯式指定上述snprintf()
語句中的格式說明符,如snprintf(duplicateId, 10, "%s", myId);
?
不,你不必在技術上。但最好這樣做,因爲如果沒有常量格式字符串,則格式字符串保持可修改狀態,因此您的代碼更容易格式化字符串攻擊。
啊,並且還使用sizeof(duplicateId)
而不是一個常數10
- 也出於安全原因(爲了避免將來的緩衝區溢出時更改sprintf輸出緩衝區的大小)。
不,你通常認爲是一個好主意,特別是如果有任何機會將用戶輸入文本傳遞給snprintf()
。如果用戶輸入與它%
否則一個字符串,就會有麻煩:
const char *userString = "%";
snprintf(duplicateId, sizeof duplicateIt, userString); /* BAD */
const char *userString = "%s";
snprintf(duplicateId, sizeof duplicateIt, "%s", userString); /* GOOD. */
這將是更好地使用%s
因爲它是更安全......難道你得到這個警告? 也嘗試在最高警告級別進行編譯。
閱讀全文here