2012-06-01 28 views
71

Der einzige Weg, ich weiß, ist:Wie konvertiert man von int nach 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(); 
} 

Aber ist es eine Methode, mit weniger tippen?

+6

warum wollen Sie eine C-Zeichenfolge anstelle eines C++ String? – KillianDS

+0

Verwenden Sie [Sprintf] (http://www.cplusplus.com/reference/clibrary/cstdio/sprintf) – Kasma

Antwort

82
  • In C++ 11, verwenden std::to_string als:

    std::string s = std::to_string(number); 
    char const *pchar = s.c_str(); //use char const* as target type 
    
  • Und in C++ 03, was Sie tun, ist ganz gut, außer Gebrauch const als:

+1

Der erste Teil beantwortet nicht die Frage (obwohl es gute hilfreiche Informationen ist, da ich nicht bewusst war Funktion) – jcoder

+0

@JohnB: Ist es jetzt in Ordnung? – Nawaz

+1

Besser :) Plus Ich gehe besser noch mehr über C++ 11 lesen. Ich weiß von den großen Features, aber das hat mir klar gemacht, dass es wahrscheinlich mehr kleine gibt, die ich vermisst habe. – jcoder

7

Sie boost

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

C-Stil Lösung itoa verwenden könnte sein, verwenden können, aber bessere Weg ist diese Zahl in Zeichenfolge sprintf/snprintf unter Verwendung zu drucken. Überprüfen Sie diese Frage: How to convert an integer to a string portably?

Beachten Sie, dass itoa Funktion nicht in ANSI-C definiert ist und nicht Teil von C++ ist, aber von einigen Compilern unterstützt wird. Es ist eine Nicht-Standard-Funktion, daher sollten Sie es vermeiden. Überprüfen Sie diese Frage auch: Alternative to itoa() for converting integer to string C++?

Beachten Sie auch, dass schreiben C-style-Code während der Programmierung in C++ als schlechte Praxis und manchmal als "greatly Stil" bezeichnet wird. Willst du es wirklich in C-style char* string konvertieren? :)

4

Ich würde die const in der letzten Zeile nicht abschreiben, da es aus einem bestimmten Grund da ist. Wenn Sie nicht mit einem const char leben können * dann besser die char-Array kopieren wie:

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

du meinst 'const char * char_type = temp_str.c_str();' ist besser? – rsk82

+1

Ja. c_str gibt Ihnen einen Zeiger auf den internen Puffer des String-Objekts. Wenn Sie die Konstante wegwerfen, könnten Sie oder ein anderer Programmierer denken, dass es in Ordnung ist, den Puffer durch die nicht-konstante Variable zu ändern. Aber es ist nicht. Das ursprüngliche Zeichenfolgenobjekt weiß nichts über diese Änderungen. Auf der anderen Seite besitzt die Saite immer noch den Puffer. Wenn das String-Objekt den Gültigkeitsbereich verlässt, wird der Speicher hinter dem Zeiger durch den Destruktor des Zeichenfol- genobjekts gelöscht, so dass Sie einen ungeeigneten Zeiger erhalten. Der Kopiervorgang entfernt beide Probleme. – user331471

+1

Alternativ: 'std :: vector temp_vec (temp_str.begin(), temp_str.end()); temp_vec.push_back (0); char * char_type = & vec [0]; '. Dies gibt Ihnen veränderlichen Speicher, obwohl Sie natürlich den Vektor weiterhin so lange am Leben halten müssen, wie Sie den Zeiger verwenden möchten. –

6

Ich denke, Sie sprintf verwenden können:

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

Sie sollten char * zu char ändern, gerade Zahlenstring ist ein Array von Zeigern – josefx

+1

Außerdem benötigen Sie 12 Zeichen, um eine 32-Bit-Ganzzahl in eine Null-terminierte Basis-10-Darstellung zu konvertieren. 10 ist nicht genug für '-2147483647'. –

+2

Wie wäre es mit einer Erklärung? '(((Größe der Zahl) * CHAR_BIT) + 2)/3 + 2' sieht aus wie Zauberei ... –

1

Sie können auch Casting verwenden.

Beispiel:

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