2012-02-03 197 views
1

我嘗試將unsigned long轉換爲字符串,並在其末尾附加一個逗號。當編譯並運行測試代碼,您可以在下面找到,我得到下面的輸出:無符號long的snprintf附加逗號

"1234," "1234" 
"1234" 

測試代碼是:

#include <cstdio> 
#include <iostream> 

int main() { 

    unsigned long c = 1234; 
    char ch[50]; 
    char ch1[50]; 

    sprintf(ch, "%lu,", c); 
    std::cout << "\"" << ch << "\"" << " \"" << c << "\"" << std::endl; 

    snprintf(ch1, 5, "%s", ch); 
    std::cout << "\"" << ch1 << "\"" << std::endl; 

    return 1; 
} 

據我瞭解,ch應該是長度爲5, 4位數加1代表逗號。

我錯過了一個額外的加終止字符嗎?

乾杯!

回答

3

傳遞給snprintf的大小包含終止空字符。雖然沒有打印,但仍然佔用緩衝區中的空間。

您應該通過strlen(ch) + 1來代替。或者更好,只要sizeof(ch1)就足夠了,因爲你想在填充緩衝區之前容納整個結果。

還要確保目標緩衝區的大小始終足夠大,等於或大於您傳遞給snprintf的大小。在你的具體情況下,它幾乎不可能發生,但總的來說,你應該記住這一點。

1

Linux manual page

The functions snprintf() and vsnprintf() write at most size bytes (including the trailing null byte ('\0')) to str.

所以,是的,你應該有6的長度,以獲得逗號爲好。

0

正如您所寫,您錯過了終止字符的額外空間。

The functions snprintf() and vsnprintf() write at most size bytes (including the terminating null byte ('\0')) to str.

1

的C++方式:

#include <string> 

unsigned long int c = 1234; 

std::string s = "\"" + std::to_string(c) + ",\""; 
std::string t = '"' + std::to_string(c) + ',' + '"'; // alternative 
+0

編譯我得到:'錯誤:「to_string」不是「std'' – ezdazuzena 2012-02-03 10:07:12

+1

@ezdazuzena成員:這需要一個現代化的編譯器(用C++ 11的支持)。在GCC中,例如'-std = C++ 0x';就我所知,MSVC10支持這一點。 – 2012-02-03 10:09:03

+0

感謝您的提示。我標記的另一個答案是正確的,因爲這個問題是相對於snprintf的。任何,謝謝你的教訓! – ezdazuzena 2012-02-03 10:18:21

0

正如一些人所指出的那樣,你需要包括空終止足夠的空間。

它總是值得檢查從的snprintf返回的結果是什麼,你覺得是應該的,也是如此。

最後,我建議你使用的snprintf(緩衝區,緩衝區尺寸,等等等等)

你不太可能得到令人尷尬的結果,如果第二個參數恰好是比你的實際空間較大有空。