Konvertieren eines int in std :: string

143

Was ist der kürzeste, vorzugsweise inline-fähige Weg, um ein int in einen String umzuwandeln? Antworten mit stl und boost werden begrüßt.

Amir Rachum
quelle
63
In C ++ 11 können Sie to_stringwiestd::string s = std::to_string(42)
5
Es lebe C ++ 11 und to_string! :)
augustin

Antworten:

350

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

int i = 3;
std::string str = std::to_string(i);
Yochai Timmer
quelle
4
std :: to_string () funktioniert in MinGW nicht, wenn es jemanden interessiert.
Archie
3
@bparker Richtig, es wurde in gcc 4.8.0 behoben, denke ich. MinGW mit den neuesten Code :: Blocks (13.12) hat immer noch gcc 4.7.1.
Archie
47
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());
Benoit
quelle
36

boost::lexical_cast<std::string>(yourint) von boost/lexical_cast.hpp

Arbeitet für alles mit std :: ostream-Unterstützung, ist aber nicht so schnell wie zum Beispiel itoa

Es scheint sogar schneller zu sein als stringstream oder scanf:

ltjax
quelle
15
Boost ist dein Freund, wenn es in Standard C ++ keine einfache Möglichkeit gibt, dies zu tun ... Ich mag natürlich, was lexical_castbringt, aber Boost ist für diese Art von Aufgaben ziemlich übertrieben ...
rubenvb
2
Overkill? Basierend worauf? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/…
Catskul
Sollte Ihr Publikum berücksichtigen, wenn es Boost
Damian
5
"Antworten mit stl und boost werden begrüßt." - Publikum berücksichtigt
Conrad Jones
30

Der bekannte Weg, dies zu tun, ist die Verwendung des Stream-Operators:

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

Natürlich können Sie es für jeden Typ mit einer Vorlagenfunktion verallgemeinern ^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}
Neuro
quelle
1
Hinweis: Dies erfordert #include <sstream>.
TechNyquist
@ TechNyquist: Du hast recht. Nicht kompilierbar, aber geändert!
Neuro
1
Du hast also nicht gemeint, dass es kompilierbar ist, aber mit dem Include ist es tatsächlich :)
TechNyquist
1
@ TechNyquist: Ja, mit einigen std::;)
Neuro
16

Wenn Sie std::to_stringC ++ 11 nicht verwenden können, können Sie es so schreiben, wie es auf cppreference.com definiert ist:

std::string to_string( int value ) Konvertiert eine vorzeichenbehaftete Dezimalzahl in eine Zeichenfolge mit demselben Inhalt wie std::sprintf(buf, "%d", value)für einen ausreichend großen Puffer.

Implementierung

#include <cstdio>
#include <string>
#include <cassert>

std::string to_string( int x ) {
  int length = snprintf( NULL, 0, "%d", x );
  assert( length >= 0 );
  char* buf = new char[length + 1];
  snprintf( buf, length + 1, "%d", x );
  std::string str( buf );
  delete[] buf;
  return str;
}

Sie können mehr damit machen. Verwenden Sie einfach "%g", um float oder double in string "%x"umzuwandeln , verwenden Sie , um int in hexadezimale Darstellungen umzuwandeln, und so weiter.

user2622016
quelle
14

Nicht standardmäßige Funktion, die jedoch auf den meisten gängigen Compilern implementiert ist:

int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);

Aktualisieren

C ++ 11 führte mehrere std::to_stringÜberladungen ein (beachten Sie, dass standardmäßig Base-10 verwendet wird).

Zac Howland
quelle
3
@ DevSolar: Sie sollten näher darauf eingehen. Das Boost-Beispiel war bereits gegeben worden. Diese Lösung ist auf den meisten Compilern verfügbar, wenn Boost nicht installiert ist (oder Ihre Anforderungen es Ihnen aus irgendeinem Grund verbieten, sie zu verwenden). Dies ostreamfunktioniert auch, bis Sie die Zahlenfolge als etwas anderes als ein Binär-, Oktal- oder Hex-Format (z. B. Basis-32) speichern müssen.
Zac Howland
3
Ich mag es nicht, wenn nicht standardmäßige Funktionen wie itoa()oder stricmp()als Antwort auf irgendetwas gegeben werden .
DevSolar
6
Es tut mir leid, Ihre Sensibilität zu verletzen, aber ich habe im ersten Satz festgestellt, dass es sich um eine nicht standardmäßige Funktion handelt. Ich habe es nicht erwähnt, sprintfkann aber auch das Ziel des OP erreichen (obwohl es immer noch unter der mangelnden Flexibilität leidet, wenn etwas anderes als die gemeinsamen Basisnummern benötigt wird).
Zac Howland
1
Ja, Sie haben es gesagt, und ich habe Ihre Antwort nicht abgelehnt, auch wenn es mich dazu juckte. Also ich denke wir sind eben. ;-)
DevSolar
8

Das folgende Makro ist nicht ganz so kompakt wie ein Einwegmakro ostringstreamoder boost::lexical_cast.

Wenn Sie jedoch wiederholt eine Konvertierung in einen String in Ihrem Code benötigen, ist dieses Makro eleganter in der Verwendung als die direkte Verarbeitung von Stringstreams oder das explizite Casting jedes Mal.

Es ist auch sehr vielseitig, da es allesoperator<<() , was von unterstützt wird , auch in Kombination konvertiert .

Definition:

#include <sstream>

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
            ( std::ostringstream() << std::dec << x ) ).str()

Erläuterung:

Dies std::decist eine nebenwirkungsfreie Methode, um das Anonyme ostringstreamin ein generisches zu verwandeln, ostreamsodass die operator<<()Funktionssuche für alle Typen korrekt funktioniert. (Andernfalls treten Probleme auf, wenn das erste Argument ein Zeigertyp ist.)

Das dynamic_castgibt den Typ zurück, ostringstreamdamit Sie ihn aufrufen str()können.

Verwenden:

#include <string>

int main()
{
    int i = 42;
    std::string s1 = SSTR( i );

    int x = 23;
    std::string s2 = SSTR( "i: " << i << ", x: " << x );
    return 0;
}
DevSolar
quelle
1
@rubenvb: Sie sagen mir, wie ich dies in eine Vorlage verwandeln kann, und ich werde alle C ++ - Projekte aktualisieren, in denen ich dieses Konstrukt verwendet habe.
DevSolar
@rubenvb: Sorry, das war nicht so klar wie es hätte sein sollen. Ich sehe keine Möglichkeit, wie ich daraus eine Vorlage (unter Verwendung von C ++ 98) machen könnte, ohne entweder die Fähigkeit zu verlieren, Ausgaben zu verketten (wie in meinem zweiten Beispiel) oder ein kompliziertes Durcheinander zu finden, um damit umzugehen beliebig viele Parameter und Parametertypen.
DevSolar
@ DevSolar: würde nicht inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }tun? (Noch nicht getestet, aber ich frage mich, was schief gehen würde und warum?
Rubenvb
@rubenvb: Es würde für eine Person reichen int(mein erstes Beispiel). Aber ohne die ostreamsichtbar an den Compiler in main(wie es in der Template - Funktion versteckt ist), wird es versuchen , zu sehen operator<<()für const char []in meinem zweiten Beispiel - das quaken wird. Ich weiß, dass das OP nur nach einem gefragt hat int, aber dieses allgemeinere Makro ist so nützlich (und tatsächlich ziemlich weit verbreitet), dass ich dachte, ich würde es hier aufnehmen.
DevSolar
Für die Vielseitigkeit bevorzuge ich eine Vorlagenfunktion. Für die Daisy-Chain kann das vielleicht in der gleichen Funktion mit ein bisschen RTTI gehandhabt werden ...
Neuro
2

Sie können diese Funktion verwenden, um nach dem Einfügen intin Folgendes zu konvertieren :std::string<sstream>

#include <sstream>

string IntToString (int a)
{
    stringstream temp;
    temp<<a;
    return temp.str();
}
Dodo
quelle
-2
#include <string>
#include <stdlib.h>

Hier ist eine weitere einfache Möglichkeit, int in einen String umzuwandeln

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

Sie können diesen Link für weitere Methoden besuchen https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/

Vipul Dungranee
quelle
muss Folgendes enthalten, um diese Methodheader-Dateien zu verwenden #include <string> #include <stdlib.h>
Vipul Dungranee
-3

Angenommen, ich habe integer = 0123456789101112. Jetzt kann diese Ganzzahl von der stringstreamKlasse in eine Zeichenfolge konvertiert werden .

Hier ist der Code in C ++:

   #include <bits/stdc++.h>
   using namespace std;
   int main()
   {
      int n,i;
      string s;
      stringstream st;
      for(i=0;i<=12;i++)
      {
        st<<i;
      }
      s=st.str();
      cout<<s<<endl;
      return 0;

    }
Shawon
quelle
Wurden nicht ähnliche, aber vollständigere Antworten bereits vor vielen Jahren gegeben?
Walter
Ja, aber diese Antwort ist perfekt, denke ich, da ich keine effektive Antwort von vorher bekommen habe.
Shawon