2014-10-02 75 views
5

我的程序在多個平臺上運行。其中,Windows CE。目前,sprintf被廣泛使用,這導致了緩衝區溢出等很多問題。我想用snprintf來代替這些調用。對於Visual Studio,我發現這個問題,解決這個問題的win32部分:用於Windows CE的snprintf

snprintf and Visual Studio 2010

,但我無法得到它的Windows CE的工作,因爲功能_vsnprintf_s_vscprintf,並不斷_TUNCATE不可用。有誰知道在Windows CE上覆制snprintf(linux)行爲的方法嗎?

+0

檢查此響應是否可以爲您提供有用信息http://stackoverflow.com/questions/23882340/windows-ce-5-0-vs-windows-mobile-6/23883768#23883768 – daniele3004 2014-10-02 09:33:15

回答

1

到目前爲止,我已經結束了以下功能:

int my_snprintf(char* str, size_t size, const char* format, ...) 
{ 
    int len = 0; 
    va_list ap; 

    if (size == 0) 
    { 
     return 0; 
    } 

    va_start(ap, format); 
    len = _vsnprintf(str, size, format, ap); 
    va_end(ap); 

    if (len < 0 || len >= size) 
    { 
     len = size - 1; 
    } 

    if (size > 0) 
    { 
     str[size - 1] = '\0'; 
    } 

    return len; 
} 

初步測試,看起來不錯,它甚至爲編譯WinCE的。任何反饋非常讚賞

+1

目前看起來不錯。只是爲了提到它:你知道,'snprintf'不能解決bug代碼?你需要重新寫兩種方式,你必須測試'snprintf'的返回值來查看是否有足夠的空間可用,如果沒有,請重新分配緩衝區(或任何適合您的情況)。 – mafso 2014-10-02 12:51:26

+0

是的,我知道 - 這將是調試代碼的下一步..現在的主要目的是爲了避免一些神祕的崩潰造成的溢出 – pjaall 2014-10-02 13:03:16

+0

'現在的主要目的是爲了避免一些神祕的崩潰造成的溢出'我不認爲你會修復你的錯誤,它只會隱藏真正的根源問題。 snprintf將防止緩衝區溢出,但是如果您的代碼邏輯需要更大的數據並且緩衝區太小,那麼它仍然不能正常工作。 – marcinj 2014-10-03 08:33:04

0

我想,你可以使用微軟專用的printf_s函數。我不確定它是否100%兼容,並且我認爲它不允許緩衝區在size爲0時爲空,但它可能足夠滿足您的要求並且...我沒有VS2010來確認printf_s存在於Windows CE版本。