簡體   English   中英

如何在 Linux C++ 中使用 ***sprintf_s***

[英]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::snprintfsprintf_s的替代sprintf_s 但是,將源字符串大小作為第二個參數傳遞是錯誤的。 您應該改為傳遞目標緩沖區的大小。

此外,您首先濫用了sprintf_s 您永遠不應該使用非常量格式字符串。 看來您正試圖簡單地復制一個字符串。 為此,例如有strlcpy (在 C++ 中不是標准的,但在 BSD 和 Linux 中存在)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM