Frage Der einfachste Weg, um int in C ++ zu konvertieren


Was ist der einfachste Weg, um von zu konvertieren? int zu gleichwertig string in C ++. Ich kenne zwei Methoden. Gibt es einen leichteren Weg?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

1208
2018-04-08 04:19


Ursprung


Antworten:


C ++ 11 führt ein std::stoi (und Varianten für jeden numerischen Typ) und std::to_string, die Gegenstücke der C atoi und itoa aber ausgedrückt in std::string.

#include <string> 

std::string s = std::to_string(42);

ist also der kürzeste Weg, den ich mir vorstellen kann. Sie können sogar die Benennung des Typs auslassen, indem Sie die auto Stichwort:

auto s = std::to_string(42);

Hinweis: siehe [string.conversions] (21.5 im n3242)


1592
2018-04-08 06:13



Nachdem einige Jahre später eine Diskussion mit @ v.oddou aufgenommen wurde, hat C ++ 17 nun einen Weg gefunden, die ursprünglich auf Makros basierende typenunabhängige Lösung zu erstellen (untenstehend erhalten). ohne durch Makrohässlichkeit gehen.

template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

Verwendung:

int i = 42;
std::string s = sstr( "i is: ", i );
puts( sstr( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( sstr( "Foo is '", x, "', i is ", i ) );

Ursprüngliche Antwort:

Da "converting ... to string" ein wiederkehrendes Problem ist, definiere ich immer das SSTR () Makro in einem zentralen Header meiner C ++ - Quellen:

#include <sstream>

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

Die Nutzung ist so einfach wie möglich:

int i = 42;
std::string s = SSTR( "i is: " << i );
puts( SSTR( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) );

Das obige ist C ++ 98 kompatibel (wenn Sie C ++ 11 nicht verwenden können std::to_string) und benötigt keine Drittanbieter-Includes (wenn Sie Boost nicht verwenden können) lexical_cast<>); Beide anderen Lösungen haben jedoch eine bessere Leistung.


165
2018-04-08 04:23



Ich verwende normalerweise die folgende Methode:

#include <sstream>

template <typename T>
  std::string NumberToString ( T Number )
  {
     std::ostringstream ss;
     ss << Number;
     return ss.str();
  }

im Detail beschrieben Hier.


96
2017-11-29 22:46



Vermutlich ist der gebräuchlichste einfache Weg, Ihre zweite Wahl in eine Vorlage mit Namen umzuwandeln lexical_castwie der in Boost, so sieht dein Code so aus:

int a = 10;
string s = lexical_cast<string>(a);

Eine feine Sache davon ist, dass es auch andere Abgüsse unterstützt (z. B. in der entgegengesetzten Richtung funktioniert genauso gut).

Beachten Sie auch, dass, obwohl Boost lexical_cast ursprünglich damit begann, nur in einen Stringstream zu schreiben und dann wieder aus dem Stream extrahiert wurde, nun ein paar Ergänzungen hinzugefügt wurde. Zuallererst wurden Spezialisierungen für einige Arten hinzugefügt, so dass es für viele gebräuchliche Typen wesentlich schneller ist als die Verwendung eines String-Streams. Zweitens prüft es jetzt das Ergebnis, also (zum Beispiel) wenn Sie von einer Zeichenkette in eine konvertieren intEs kann eine Ausnahme auslösen, wenn die Zeichenfolge etwas enthält, das nicht in eine konvertiert werden konnte int (z.B., 1234 würde gelingen, aber 123abc würde werfen).

Ab C ++ 11 gibt es ein std::to_string Überladene Funktion für Integer-Typen, so können Sie Code wie verwenden:

int a = 20;
std::string s = to_string(a);

Der Standard definiert diese als gleichwertig mit der Konvertierung mit sprintf (mit dem Konvertierungsspezifizierer, der dem angegebenen Objekttyp entspricht, z. B. %d zum int), in einen Puffer von ausreichender Größe, dann erstellen ein std::string des Inhalts dieses Puffers.


84
2018-04-08 04:23



Wenn Sie Boost installiert haben (was Sie sollten):

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);

40
2018-04-08 04:26



Wäre es nicht einfacher, Stringstreams zu verwenden?

#include <sstream>

int x=42;            //The integer
string str;          //The string
ostringstream temp;  //temp as in temporary
temp<<x;
str=temp.str();      //str is temp as string

Oder mache eine Funktion:

#include <sstream>

string IntToString (int a)
{
    ostringstream temp;
    temp<<a;
    return temp.str();
}

27
2018-04-16 19:37



Nicht, dass ich weiß, in reinem C ++. Aber eine kleine Änderung von dem, was du erwähnt hast

string s = string(itoa(a));

sollte funktionieren, und es ist ziemlich kurz.


19
2018-04-08 04:22



sprintf() ist ziemlich gut für die Formatkonvertierung. Sie können dann die resultierende C-Zeichenfolge der C ++ - Zeichenfolge wie in 1 zuweisen.


16
2018-04-08 04:23