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.
to_string
wiestd::string s = std::to_string(42)
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.
to_string
wiestd::string s = std::to_string(42)
Antworten:
Sie können std :: to_string in C ++ 11 verwenden
int i = 3;
std::string str = std::to_string(i);
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:
lexical_cast
bringt, aber Boost ist für diese Art von Aufgaben ziemlich übertrieben ...
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();
}
#include <sstream>
.
std::
;)
Wenn Sie std::to_string
C ++ 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 wiestd::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.
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).
ostream
funktioniert auch, bis Sie die Zahlenfolge als etwas anderes als ein Binär-, Oktal- oder Hex-Format (z. B. Basis-32) speichern müssen.
itoa()
oder stricmp()
als Antwort auf irgendetwas gegeben werden .
sprintf
kann 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).
Das folgende Makro ist nicht ganz so kompakt wie ein Einwegmakro ostringstream
oder 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::dec
ist eine nebenwirkungsfreie Methode, um das Anonyme ostringstream
in ein generisches zu verwandeln, ostream
sodass die operator<<()
Funktionssuche für alle Typen korrekt funktioniert. (Andernfalls treten Probleme auf, wenn das erste Argument ein Zeigertyp ist.)
Das dynamic_cast
gibt den Typ zurück, ostringstream
damit 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;
}
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?
int
(mein erstes Beispiel). Aber ohne die ostream
sichtbar 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.
Sie können die Implementierung von itoa in Ihr Projekt aufnehmen.
Hier ist itoa geändert, um mit std :: string zu arbeiten: http://www.strudel.org.uk/itoa/
#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/
Angenommen, ich habe integer = 0123456789101112
. Jetzt kann diese Ganzzahl von der stringstream
Klasse 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;
}