2012-06-29 126 views
1

我想一個int轉換爲一個CString。我決定通過stringstream將int讀入常規字符串,然後將字符串讀入char數組。以下似乎工作,但我想知道如果我只是幸運地與我的編譯器。代碼看起來好聽嗎?謝謝!將字符串轉換到C風格的字符串

int zip = 1234;  

char zipString[30]; 

stringstream str; 

str << zip; 

str >> zipString; 

cout << zipString; 
+1

更好地推動這一問題http://codereview.stackexchange.com/ – ArtemStorozhuk

+0

你需要有字符串作爲C-字符串,而不是一個'的std :: string'任何理由嗎?後者通常是一個更好的選擇,除非你被傳統代碼所束縛。 –

+0

我需要獨立處理字符串中的每個'整數'。看起來像一個數組可以讓我選擇它們以便最簡單。 – AlmostSurely

回答

4

您可以從流的str()功能得到了C++ std::string,並從字符串的c_str()功能的不可變的C風格的0結尾的字符串:

std::string cpp_string = str.str(); 
char const * c_string = cpp_string.c_str(); 

你可能想將這些組合成單個表達式,str.str().c_str(),但那將是錯誤;在你用指針做任何事情之前,C++字符串將被銷燬。

你在做什麼都可以工作,只要你確定緩衝區足夠大;但使用C++字符串消除了溢出緩衝區的危險。一般來說,除非需要使用需要它們的API(或者在極端情況下,作爲避免內存分配的優化),否則最好避免使用C風格的字符串。 std::string通常更安全,更易於使用。

+0

謝謝!出於好奇,你會建議不要做我所做的事嗎? – AlmostSurely

+0

你是對的!我想'stringstream.str()''返回的std :: string&','不是的std :: string' :) – dasblinkenlight

+1

@IniquiTrance:一般來說,我會建議使用'的std :: string'字符串,除非有令人信服的理由使用別的東西。 –

1

std::stringc_str()成員函數返回const char*(又名C風格的字符串)。

std::string str = "world"; 
printf("hello, %s", str.c_str()); 
2

除非你有一個特定的原因,你需要一個字符數組而不是標準字符串,我會使用後者。雖然這不是絕對必要在這種情況下,我還通常使用升壓lexical_cast,而不是明確地搬東西通過一個字符串流來進行轉換:

std::string zipString = lexical_cast<std::string>(zip); 

然後,如果你真的需要的結果作爲C-樣式字符串,你可以使用zipString.c_str()來獲得(雖然它仍然以不同的方式 - 你不能修改返回的內容)。

在這種特定的情況下,它不會獲得你很多,但是這一般順序對轉換統一使用增加了,如果你要做到這一點,你還不如在這裏使用它。

+0

你獲得快速失敗的行爲,這是很多。我從來沒有見過整個組織檢查流的失敗位一致(包括@IniquiTrance)。 –

+0

@TomKerr:好點。 –