[英]How to use ***sprintf_s*** for linux C++
我正在嘗試使用 Visual Studio 的 Windows C++ 項目中的相同頭文件和.cpp
文件創建 Linux C++ 項目。 我正在使用sprintf_s
將字符串轉換為數組。
但是當我將相同的代碼移植到 Linux 時, sprintf_s
顯示錯誤。 sprintf_s
還有其他替代sprintf_s
嗎?
可以使用snprintf
而不是sprintf_s
嗎?
#if _WINDLL
sprintf_s(DestinationArray, SourceString.c_str()); //Syntax using sprintf_s for Windows
#else
snprintf(DestinationArray, SourceString.length(), SourceString.c_str()); //syntax using snprintf For Linux
#endif
上面的語法正確嗎? 我是 C++ 的新手。 請幫忙。
sprintf_s
傳遞DestinationArray
的大小,而不是 SourceString。 此外,不要將任意字符串作為格式字符串傳遞,這就是您獲得格式字符串漏洞的方式。
一個更正確的公式:
#if _WINDLL
sprintf_s(DestinationArray, "%s", SourceString.c_str()); //Syntax using sprintf_s for Windows
#else
snprintf(DestinationArray, sizeof(DestinationArray), "%s", SourceString.c_str()); //syntax using snprintf For Linux
#endif
或者您可以將sprintf_s
for Linux 定義為宏:
#define sprintf_s(buf, ...) snprintf((buf), sizeof(buf), __VA_ARGS__)
sprintf_s 還有其他替代品嗎?
有std::snprintf
。 更好的是,您可以使用std::string
和 iostreams。
可以使用 snprintf 而不是 sprintf_s 嗎?
std::snprintf
是sprintf_s
的替代sprintf_s
。 但是,將源字符串大小作為第二個參數傳遞是錯誤的。 您應該改為傳遞目標緩沖區的大小。
此外,您首先濫用了sprintf_s
。 您永遠不應該使用非常量格式字符串。 看來您正試圖簡單地復制一個字符串。 為此,例如有strlcpy
(在 C++ 中不是標准的,但在 BSD 和 Linux 中存在)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.