2009-06-03 71 views

Antwort

49

Sie könnten Stringstream verwenden.

Es gibt normalerweise einige proprietäre C-Funktionen in der Standardbibliothek für Ihren Compiler, die es auch tut. Ich bevorzuge jedoch die "tragbaren" Varianten.

Der C-Weg wäre mit sprintf, aber das ist nicht sehr sicher. In einigen Bibliotheken gibt es neue Versionen wie sprintf_s, die vor Pufferüberläufen schützen.

1

Auschecken std::stringstream.

3
#include <sstream> 


    .... 

    std::stringstream ss; 
    ss << a_long_int; // or any other type 
    std::string result=ss.str(); // use .str() to get a string back 
+1

Es ist std :: string, nicht std :: String. – avakar

+0

Danke - Finger Ärger. –

-1

Die Art, wie ich es normalerweise mache, ist mit Sprintf. Also für eine lange könnten Sie wie folgt vorgehen davon aus, dass Sie auf einem 32-Bit-Architektur sind:

char buf[5] = {0}; // one extra byte for null  
sprintf(buf, "%l", var_for_long); 
+1

-1. Während ein C++ - Compiler Ihren Code kompiliert, sollte er sicherlich nicht C++ heißen. Außerdem bezweifle ich 5 Zeichen ist genug. – avakar

+1

Bitte sprechen Sie nicht Sprintf in dieser Zeit. Haben wir nicht genug Pufferüberlauf-Exploits? Nicht, dass dieser Code so geschrieben zu haben scheint - aber man weiß nie, wie sich die Dinge ändern. – philsquared

+1

Phil, der Puffer wird für eine beliebige Zahl über 10000 überlaufen. – avakar

8
int main() 
{ 
    long mylong = 123456789; 
    string mystring; 
    stringstream mystream; 
    mystream << mylong; 
    mystring = mystream.str(); 
    cout << mystring << "\n"; 
    return 0; 
} 
4

mehrere Möglichkeiten gibt es. Lesen Sie The String Formatters of Manor Farm für einen ausführlichen Vergleich.

+0

Das ist ein guter Artikel. – Skurmedel

+1

Ja. Dies ist mindestens das dritte Mal, dass ich es auf SO verlinkt habe. 8v) –

22

Nun, wenn Sie Fan von Copy-Paste, hier ist es:

#include <sstream> 

template <class T> 
inline std::string to_string (const T& t) 
{ 
    std::stringstream ss; 
    ss << t; 
    return ss.str(); 
} 
+0

Sie haben 'template ' verpasst. – avakar

+0

Danke, ich habe Update-Antwort. –

+0

'inline' ist jetzt redundant. – avakar

7

Ich weiß nicht, welche Art von Hausaufgaben ist dies, aber die meisten wahrscheinlich der Lehrer will nicht eine Antwort, wenn Sie Nennen Sie einfach eine "magische" existierende Funktion (obwohl das die empfohlene Methode ist), aber er möchte sehen, ob Sie das selbst implementieren können.

Früher sagte mein Lehrer etwas wie "Ich möchte sehen, ob du selbst programmieren kannst, nicht wenn du es im System findest." Nun, wie falsch er war;) ..

Wie auch immer, wenn Ihr Lehrer das gleiche ist, hier ist die harte Weise es zu tun ..

std::string LongToString(long value) 
{ 
    std::string output; 
    std::string sign; 

    if(value < 0) 
    { 
    sign + "-"; 
    value = -value; 
    } 

    while(output.empty() || (value > 0)) 
    { 
    output.push_front(value % 10 + '0') 
    value /= 10; 
    } 

    return sign + output; 
} 

Man könnte argumentieren, dass std::string mit nicht "auf die harte Tour", aber ich denke, was zählt in der eigentlichen Agorithmie.

+0

Diesmal ist es in Ordnung, fertige Funktionen zu verwenden. Aber danke für diese nette Idee. –

+0

Wirklich? Er überprüft nur, ob Sie irgendwo eine Funktion finden können? Ja, die Zeiten haben sich geändert;) .. – beef2k

+0

@ beef2k Noch besser - er merkt, dass ich OOP kenne, fühle mich beeindruckt und überprüfe nichts anderes. :) –

1

Eines der Dinge, von niemandem bedeckt, so weit, fallen Sie das Problem weiter zu denken, ist, welches Format sollte ein lange nehmen, wenn es in einen String umgewandelt wird.

Schauen Sie sich einfach ein Spreadsheet-Programm (wie Calc/Excel) an. Willst du es auf die nächste Million gerundet, mit Klammern, wenn es negativ ist, immer um das Zeichen zu zeigen .... Ist die Zahl wirklich eine Darstellung von etwas anderem, sollten Sie es stattdessen in Oractal oder Hex zeigen?

Die Antworten haben Ihnen bisher einige Standardausgaben gegeben, aber vielleicht nicht die richtigen.

+0

Wenn ich das brauchte, würde ich meine Frage bearbeiten. :) –

+0

Liebe es, ich gebe eine überlegte Antwort auf die Frage, um mit dem Nachdenken über die Hausaufgaben zu helfen, anstatt die Antwort zu geben, die bereits da war, und ich bekomme einen Downvote, während 'std :: stringstream' eine Verbesserung hat ... –

41

In C++ 11 gibt es tatsächlich std :: to_string und std :: to_wstring Funktionen in <Zeichenfolge>.

string to_string(int val); 
string to_string(long val); 
string to_string(long long val); 
string to_string(unsigned val); 
string to_string(unsigned long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string (long double val); 
1

Sie können std::to_string in C++ verwenden 11

long val = 12345; 
std::string my_val = std::to_string(val); 
Verwandte Themen