2010-11-04 120 views
1

我將現有的Windows應用程序移植到Linux。Linux中用於跨平臺應用程序的sprint_f宏

大多數OS APIs \ Microsoft非標準擴展函數可以很容易地(或多或少)由等效的Linux \ GCC API取代,但是,我不知道如何處理sprintf_s,可變數量的參數。

有沒有人有一個想法(如果你可以請把代碼示例以及)?

謝謝大家提前。

回答

4

首先,你可以移植你的代碼來使用C++ iostreams代替(例如ostringstream)嗎?這將完全消除sprintf系列功能的所有可能問題,並且如果呼叫點數量有限,則可能是最佳選擇。如果這不是一個選項:sprintf_s函數基本上是幫助我們防止錯誤(和外部濫用導致緩衝區溢出從http://msdn.microsoft.com/en-us/library/ce3zzk1k%28VS.80%29.aspx我們知道它有兩件事:它檢查格式字符串的有效格式(這並不意味着它檢查類型 - 它仍然不能這樣做),它允許指定一個最大長度

最好的替代品將是snprintf它確實有侷限性與sprintf_s相比, t格式化字符串驗證並非所有版本都保證最終的字符串會被終止:您總是希望在調用之後將null存儲到緩衝區的最後一個字符中,以確保最終字符串爲空ter minated。

0

snprintf具有相同的簽名,但AFAIK的行爲方式稍有不同。

0

sprintf_s只是一個「安全」版本(需要緩衝區長度作爲額外的參數)的sprintf,你可以使用sprintf爲你的端口嗎?

+0

+1好的輔導('_s'變種都不是很安全的,無論如何,他們只是隱藏一些'sprintf'限制) 。 – 2010-11-04 13:28:00

+0

「反正不太安全」?什麼? sprintf_s有一個額外的緩衝區長度參數,可以防止緩衝區溢出。你怎麼能說它不安全,基於它不安全? – BJovke 2016-05-10 15:10:47

-1

爲什麼不只是提供sprintf_s for Linux的條件編譯實現?這個實現可以簡單地忽略額外的參數並通過sprintf()調用。

0

添加到源文件的頭文件或開頭結尾:

#ifndef _WIN32 
    #define sprintf_s(dest,len,format,...) sprintf(dest,format,__VA_ARGS__) 
#endif