Wie kann ich umwandeln std::string zu int?
Habe nur eine kurze Frage. Ich habe mir im internet schon ein bisschen, und ich habe gefunden ein paar Lösungen, aber keiner von Ihnen arbeitete noch. Auf der Suche bei der Umwandlung von einem string in eine int-und ich meine nicht den ASCII-codes.
Für eine schnelle Lauf-down, wir sind übergegangen in die Gleichung ein, die als string. Wir sind, um es zu brechen, formatieren Sie Sie richtig und lösen Sie die linearen Gleichungen. Nun, sagen, dass, ich bin nicht in der Lage zu konvertieren einen string in einen int.
Ich weiß, dass der string im format (-5) oder (25) etc. also ist es definitiv ein int. Aber wie wollen wir-Extrakt, der aus einem string?
Einer Weise, die ich dachte mit eine for/while-Schleife durch den string, überprüfen Sie für eine Ziffer, extrahiert alle Ziffern nach, dass und dann schauen, um zu sehen, ob es zu einem führenden '-', wenn es ist, multiplizieren Sie den int mit -1.
Scheint es ein wenig kompliziert für so ein kleines problem. Irgendwelche Ideen?
- Haben Sie versucht
atoi()
? - cplusplus.com/reference/clibrary/cstdlib/atoi
- stackoverflow.com/search?q=convert+string+int++c%2B%2B
- kannst du ein Beispiel?
- Haben Sie einen Blick auf boost::lexical_cast: boost.org/doc/libs/1_47_0/libs/conversion/lexical_cast.htm
- Du bist also empfiehlt er eine ganze Bibliothek, was die Sprache kann mit standard-Bibliotheken überhaupt?
- Sonderbar genug, Ihr zu sagen, dass "Keine passende Funktion für Aufruf von 'atoi'? Werde denke, es dauert ein char nicht ein std::string?
- wenn Sie eine
std::string
myString
und wollenatoi
, dann wollen Sie sagenatoi(myString.c_str())
. - Okay, danke Rob 🙂
- und die Menschen Fragen, warum, wenn Sie erzählt, dass c++ zu langsam ist 😉
- eh?
- wies hauptsächlich auf die boost:: lexical_cast Vorschlag(s) - Hinweis: der wink 😉
- ist die lexikalische Besetzung ineffizient?
- sehen JamWaffles Kommentar
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C++11 gibt es einige nette neue Funktionen konvertieren von
std::string
zu einer Nummer geben.Also statt
können Sie
wo
str
ist Ihre Nummer alsstd::string
.Gibt es die version für alle Geschmacksrichtungen zahlen:
long stol(string)
,float stof(string)
,double stod(string)
,...sehen http://en.cppreference.com/w/cpp/string/basic_string/stol
"11x"
integer11
.from_chars
von C++17? Es soll um Größenordnungen schneller alsstoi
.Werden richtig voll werden Sie wollen, überprüfen Sie die Fehler-flags.
-5
aus(-5)
.But how do we extract that from a string?
verwenden Sie die atoi-Funktion konvertieren Sie die Zeichenfolge in eine ganze Zahl:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
atoi
.strtol
tut allesatoi
tut, aber besser, und scheitert sicher.Die möglichen Optionen sind unten beschrieben:
1. Erste option: sscanf()
Ist dies ein Fehler (auch gezeigt durch cppcheck), weil "scanf ohne Feld Breite können Sie Grenzwerte Absturz mit riesigen input-Daten auf einigen Versionen von libc" (siehe hier, und hier).
2. Zweite option: std::sto*()
Diese Lösung ist kurz und elegant, aber es ist verfügbar nur auf auf C++11-konform Compiler.
3. Dritte option: sstreams
Jedoch mit dieser Lösung ist schwer zu unterscheiden zwischen bad Eingang (siehe hier).
4. Vierte option: Erhöhung der lexical_cast
Dies ist jedoch nur eine Hülle für sstream, und die Dokumentation empfiehlt die Verwendung sstrem für bessere Fehler-management (siehe hier).
5. Fünfte option: strto*()
Diese Lösung ist sehr lange, aufgrund von Fehler-management, und es ist hier beschrieben. Da es keine Funktion gibt eine nur int, eine Konvertierung ist erforderlich, im Falle von integer (siehe hier, wie diese Umwandlung erreicht werden kann).
6. Die sechste option: Qt
Schlussfolgerungen
Zusammenfassend kann man sagen, die beste Lösung ist C++11 std::es ist() oder-als zweite option, die Verwendung der Qt-Bibliotheken.
Alle anderen Lösungen sind entmutigt oder buggy.
Was Boost.Lexical_cast?
Hier ist Ihr Beispiel:
Zugegeben, meine Lösung würde nicht funktionieren, für negative ganze zahlen, aber es wird extrahieren Sie alle positiven ganzen zahlen von der Eingabe von text mit Ganzzahlen. Es macht Gebrauch von
numeric_only
Gebietsschema:Input text:
Ausgabe von Ganzzahlen:
Klasse
numeric_only
ist definiert als:Vollständige online-demo : http://ideone.com/dRWSj
Es ist wohl ein bisschen übertrieben, aber
boost::lexical_cast<int>( theString )
sollte der jobganz gut.
theString&
? Was ist&
?boost::lexical_cast<int>( theString )
(wotheString
ist der name der variable, die die Zeichenfolge enthält, die Sie konvertieren möchten, umint
).atoi
ist eine eingebaute Funktion, konvertiert einen string in einen integer, vorausgesetzt, dass die Zeichenfolge beginnt mit einem integer-Darstellung.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
atoi
verwendenstrtol
statt.In Windows, die Sie verwenden könnten:
strtol
,stringstream
müssen Sie die Basis, wenn Sie brauchen, um zu interpretieren hexdecimal.Gut, viele Antworten, viele Möglichkeiten. Was ich hier vermisst wird einige Universelle Methode konvertiert einen string zu verschiedenen C++ - Integrale Datentypen (short, int, long, bool, ...).
Ich kam auf folgende Lösung:
Hier sind einige Beispiele der Verwendung:
Warum nicht einfach stringstream output-operator zur Konvertierung einer Zeichenfolge in einen ganzzahligen Typ?
Hier ist die Antwort:
Lassen Sie uns sagen, ein string enthält einen Wert, der den Grenzwert überschreitet, die für bestimmt sind integraler Typ. Unter anderem, auf Wndows 64 max int 2147483647.
Weisen Sie einen string-Wert max int + 1: string str = "2147483648".
Nun, beim konvertieren den string in eine int -:
x wird 2147483647, was definitiv ein Fehler: string "2147483648" wurde nicht konvertiert werden soll, um die int 2147483647. Die bereitgestellte Funktion toIntegralType spots, solche Fehler zu und wirft die Ausnahme.
Vom http://www.cplusplus.com/reference/string/stoi/
Ausgabe:
2001, A Space Odyssey: 2001 und [, A Space Odyssey]
40c3: 16579
-10010110001: -1201
0x7f: 127
Einer Zeile version:
long n = strtol(s.c_str(), NULL, base);
.(
s
ist der string, undbase
ist einint
wie 2, 8, 10, 16.)Finden Sie in dieser link für mehr details
strtol
.Den Kern der Idee ist die Verwendung
strtol
- Funktion, die enthalten ist incstdlib
.Seit
strtol
nur Griffe mitchar
array, die wir brauchen, um zu konvertierenstring
zuchar
array. Sie können sich auf dieser link.Beispiel:
die Ausgabe:
Mein Code:
gibt es eine andere einfache Möglichkeit : angenommen, Sie haben einen Charakter wie
c='4'
daher können Sie einen der folgenden Schritte aus :1.: int f
q=(int) c ; (q is now 52 in ascii table ) .
q=q-48; remember that adding 48 to digits is their ascii code .
die zweite Möglichkeit :
q=c-'0'; the same , character '0' means 48
string
zuint
anstatt vonchar
zustring
.