Habe nur eine kurze Frage. Ich habe mich ziemlich viel im Internet umgesehen und ein paar Lösungen gefunden, aber keine davon hat bisher funktioniert. Wenn ich eine Zeichenfolge in eine int konvertiere, meine ich nicht ASCII-Codes.
Für einen schnellen Ablauf werden wir in einer Gleichung als Zeichenfolge übergeben. Wir sollen es zerlegen, richtig formatieren und die linearen Gleichungen lösen. Wenn ich das sage, kann ich einen String nicht in einen Int konvertieren.
Ich weiß, dass die Zeichenfolge entweder das Format (-5) oder (25) usw. hat, also ist es definitiv ein int. Aber wie extrahieren wir das aus einer Zeichenfolge?
Eine Möglichkeit, die ich mir vorgestellt habe, besteht darin, eine for / while-Schleife durch die Zeichenfolge zu führen, nach einer Ziffer zu suchen, danach alle Ziffern zu extrahieren und dann zu prüfen, ob ein führendes '-' vorhanden ist. Wenn dies der Fall ist, multiplizieren Sie das int mit - 1.
Für ein so kleines Problem scheint es allerdings etwas zu kompliziert. Irgendwelche Ideen?
atoi()
?std::string
myString
haben und verwenden möchtenatoi
, dann möchten Sie sagenatoi(myString.c_str())
.Antworten:
In C ++ 11 gibt es einige nette neue Konvertierungsfunktionen von
std::string
in einen Zahlentyp.Also statt
Sie können verwenden
wo
str
ist deine nummer alsstd::string
.Es gibt Version für alle Varianten von Zahlen:
long stol(string)
,float stof(string)
,double stod(string)
, ... siehe http://en.cppreference.com/w/cpp/string/basic_string/stolquelle
"11x"
in eine Ganzzahl konvertiert11
.from_chars
C ++ 17 zu aktualisieren ? Es soll Größenordnungen schneller sein alsstoi
.stoi
sollte bevorzugt werden. Siehe Warum sollte ich atoi () nicht verwenden?Um vollständig korrekt zu sein, sollten Sie die Fehlerflags überprüfen.
quelle
-5
aus(-5)
.Die möglichen Optionen werden unten beschrieben:
1. Erste Option: sscanf ()
Dies ist ein Fehler (auch durch cppcheck angezeigt), da "scanf ohne Feldbreitenbeschränkungen bei einigen libc-Versionen mit großen Eingabedaten abstürzen kann" (siehe hier und hier ).
2. Zweite Option: std :: sto * ()
Diese Lösung ist kurz und elegant, aber nur auf C ++ 11-kompatiblen Compilern verfügbar.
3. Dritte Option: sstreams
Bei dieser Lösung ist es jedoch schwierig, zwischen schlechten Eingaben zu unterscheiden (siehe hier ).
4. Vierte Option: Boosts lexical_cast
Dies ist jedoch nur ein Wrapper von
sstream
, und in der Dokumentation wird empfohlen, ihnsstream
für ein besseres Fehlermanagement zu verwenden (siehe hier ).5. Fünfte Option: strto * ()
Diese Lösung ist aufgrund des Fehlermanagements sehr lang und wird hier beschrieben. Da keine Funktion ein einfaches int zurückgibt, ist bei einer Ganzzahl eine Konvertierung erforderlich (siehe hier, wie diese Konvertierung erreicht werden kann).
6. Sechste Option: Qt
Schlussfolgerungen
Zusammenfassend ist die beste Lösung C ++ 11
std::stoi()
oder als zweite Option die Verwendung von Qt-Bibliotheken. Alle anderen Lösungen sind nicht empfehlenswert oder fehlerhaft.quelle
Verwenden Sie die Funktion atoi, um die Zeichenfolge in eine Ganzzahl zu konvertieren:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
quelle
atoi
.strtol
macht allesatoi
macht, aber besser und scheitert sicher.Was ist mit Boost.Lexical_cast ?
Hier ist ihr Beispiel:
quelle
Zugegeben, meine Lösung würde für negative Ganzzahlen nicht funktionieren, aber sie extrahiert alle positiven Ganzzahlen aus Eingabetext, der Ganzzahlen enthält. Es verwendet das
numeric_only
Gebietsschema:Eingabetext:
Ausgabe-Ganzzahlen:
Die Klasse
numeric_only
ist definiert als:Vollständige Online-Demo: http://ideone.com/dRWSj
quelle
Es ist wahrscheinlich ein bisschen übertrieben,
boost::lexical_cast<int>( theString )
sollte aber ganz gut zum Job passen.quelle
boost::lexical_cast<int>( theString )
(wotheString
ist der Name der Variablen, die die Zeichenfolge enthält, in die Sie konvertieren möchtenint
).atoi
ist eine integrierte Funktion, die eine Zeichenfolge in eine Ganzzahl konvertiert, vorausgesetzt, die Zeichenfolge beginnt mit einer Ganzzahldarstellung.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
quelle
atoi
Verwenden Siestrtol
stattdessen jedes Mal, wenn Sie darüber nachdenken .In Windows können Sie Folgendes verwenden:
strtol
,stringstream
müssen die Basis angeben, wenn Sie hexadezimal interpretieren müssen.quelle
Nun, viele Antworten, viele Möglichkeiten. Was mir hier fehlt, ist eine universelle Methode, die einen String in verschiedene C ++ - Integraltypen konvertiert (kurz, int, lang, bool, ...). Ich habe folgende Lösung gefunden:
Hier sind Anwendungsbeispiele:
Warum nicht einfach den Stringstream-Ausgabeoperator verwenden, um einen String in einen integralen Typ zu konvertieren? Hier ist die Antwort: Angenommen, eine Zeichenfolge enthält einen Wert, der die Grenze für den beabsichtigten Integraltyp überschreitet. Zum Beispiel ist auf Windows 64 max int 2147483647. Weisen wir einem String einen Wert max int + 1 zu: string str = "2147483648". Wenn Sie nun den String in ein int konvertieren:
x wird zu 2147483647, was definitiv ein Fehler ist: Die Zeichenfolge "2147483648" sollte nicht in die int 2147483647 konvertiert werden. Die bereitgestellte Funktion toIntegralType erkennt solche Fehler und löst eine Ausnahme aus.
quelle
Von http://www.cplusplus.com/reference/string/stoi/
Ausgabe:
2001, Eine Weltraum-Odyssee: 2001 und [, Eine Weltraum-Odyssee]
40c3: 16579
-10010110001: -1201
0x7f: 127
quelle
Mein Code:
quelle
quelle
Um von der Zeichenfolgendarstellung in einen ganzzahligen Wert zu konvertieren, können wir std :: stringstream verwenden.
Wenn der konvertierte Wert für den Datentyp "Integer" außerhalb des Bereichs liegt, wird INT_MIN oder INT_MAX zurückgegeben.
Auch wenn der Zeichenfolgenwert nicht als gültiger int-Datentyp dargestellt werden kann, wird 0 zurückgegeben.
Ausgabe: 50
Gemäß der obigen Ausgabe können wir sehen, dass es von Zeichenfolgenummern in Ganzzahlen konvertiert wird.
Quelle und mehr unter Zeichenfolge zu int c ++
quelle
Einzeilige Version :
long n = strtol(s.c_str(), NULL, base);
.(
s
ist die Zeichenfolge undbase
ist eineint
wie 2, 8, 10, 16.)Sie können auf diesen Link für weitere Details von verweisen
strtol
.Die Kernidee ist die Verwendung der
strtol
Funktion, die in enthalten istcstdlib
.Da
strtol
nur mitchar
Array behandelt wird, müssen wirstring
inchar
Array konvertieren . Sie können auf diesen Link verweisen .Ein Beispiel:
welches ausgegeben wird:
quelle
Es gibt noch einen anderen einfachen Weg: Angenommen, Sie haben einen Charakter wie diesen,
c='4'
daher können Sie einen der folgenden Schritte ausführen:1. int q
q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .
der zweite Weg:
q=c-'0'; the same , character '0' means 48
quelle
string
nachint
als von vonchar
nachstring
.