2012-06-01 101 views
71

我知道的唯一方法是:如何將int轉換爲char *?

#include <sstream> 
#include <string.h> 
using namespace std; 

int main() { 
    int number=33; 
    stringstream strs; 
    strs << number; 
    string temp_str = strs.str(); 
    char* char_type = (char*) temp_str.c_str(); 
} 

但有較少的打字任何方法?

+6

爲什麼你要一個C字符串而不是C++字符串? – KillianDS

+0

使用[sprintf](http://www.cplusplus.com/reference/clibrary/cstdio/sprintf) – Kasma

回答

82
  • 在C++ 11,使用std::to_string爲:在

    std::string s = std::to_string(number); 
    char const *pchar = s.c_str(); //use char const* as target type 
    
  • 和C++ 03,你在做什麼就好了,除非使用const爲:

    char const* pchar = temp_str.c_str(); //dont use cast 
    
+1

第一部分實際上並沒有回答這個問題(雖然這是很有幫助的信息,因爲我沒有意識到這一點函數) – jcoder

+0

@JohnB:現在好嗎? – Nawaz

+1

更好:)再加上我最好再讀一遍關於C++ 11的更多信息。我知道這些大特點,但這讓我意識到,我錯過了更多的小特徵。 – jcoder

7

可以使用升壓

#include <boost/lexical_cast.hpp> 
string s = boost::lexical_cast<string>(number); 
5

C風格的解決方案可能是使用itoa,但更好的辦法是使用sprintf/snprintf打印這個數字轉換爲字符串。檢查這個問題:How to convert an integer to a string portably?

注意itoa功能沒有在ANSI-C定義,而不是C++的一部分,而是由一些編譯器的支持。這是一個非標準功能,因此您應該避免使用它。請檢查這個問題:Alternative to itoa() for converting integer to string C++?

另外請注意,編寫C風格的代碼,而在C++編程被認爲是不好的做法,有時被稱爲「可怕的風格」。你真的想把它轉換成C風格的char*字符串嗎? :)

4

我不會在最後一行註釋掉const,因爲它在那裏是有原因的。如果你不能用一個const char *生活,那麼你更好的字符數組複製這樣的:

char* char_type = new char[temp_str.length()]; 
strcpy(char_type, temp_str.c_str()); 
+0

你的意思是'const char * char_type = temp_str.c_str();'比較好? – rsk82

+1

是的。 c_str給你一個指向字符串對象內部緩衝區的指針。如果你拋棄const,你或另一個程序員可能認爲可以通過非const變量更改緩衝區。但事實並非如此。原始的字符串對象不知道有關這些更改的任何信息。另一方面,字符串仍然擁有緩衝區。如果字符串對象超出範圍,則指針後面的內存將被字符串對象析構函數刪除,並留下一個懸掛指針。複製操作消除了兩個問題。 – user331471

+1

或者,'std :: vector temp_vec(temp_str.begin(),temp_str.end()); temp_vec.push_back(0); char * char_type =&vec [0];'。這給你可變內存,當然你仍然需要保持矢量活着,只要你想使用指針。 –

6

我想你可以使用的sprintf:

int number = 33; 
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2]; 
sprintf(numberstring, "%d", number); 
+0

您應該將char *更改爲char,現在numberstring是一個指針數組 – josefx

+1

此外,您需要12個字符才能將32位整數轉換爲nul終止的base-10表示。對於'-2147483647',10是不夠的。 –

+2

如何解釋一下? '(((sizeof number)* CHAR_BIT)+ 2)/ 3 + 2'看起來像魔術...... –

1

您也可以使用鑄造。

例如:

string s; 
int value = 3; 
s.push_back((char)('0' + value));