string zu int
-
Hey warum funktioniert das hier nicht ?
#include <iostream> #include <string> #include <sstream> using namespace std; int main() { string s = "LOL"; stringstream ss(s); int value = 0; if(!ss >> value) return 1; cout << value; }Er gibt true zurück und value ist immer noch 0.
So geht es...
if(ss >> value) cout << value; else return 1;
-
!ss >> valueDas macht einen
bitwise right shiftund zwar auf 0.
-
//machs doch einfach so... string test = "test"; for (string::iterator i = test.begin(); i != test.end(); i++) cout << int(*i) << endl;
-
@realKoala: Das ist totaler Schwachsinn.
Vorschlag:
std::string const stringval = "12345"; int intval; if(std::istringstream(stringval) >> intval) // yay else // oh noes
-
Um mal Butter bei die Fische zu tun und das ganze Halbwissen im Thread besser zu erklären: Da fehlen einfach nur ein paar Klammern, da ! stärker bindet als >>:
if(!(ss >> value))Bei dem vorherigen
if(!ss >> value)wird zuerst !ss ausgewertet, was false ergibt, da der Stream zu dem Zeitpunkt nicht in einem Fehlerzustand ist. false als Integer hat den Wert 0, dieser wird dann um 0 nach rechts geshiftet, was immer noch 0 ist und entsprechend schlägt die if-Bedingung nicht an. Ebenso wurde an value nichts geändert, es wurde bloß sein Wert benutzt.
-
314159265358979 schrieb:
@realKoala: Das ist totaler Schwachsinn.
Weil..
- In dem String gar keine Zahl drin ist und
- Vergessen wurde '0' abzuziehen
Zur Erläuterung: In der ASCII-Tabelle lässt sich erkennen, dass die Ziffern 0 bis 9 direkt hintereinder liegen. Mit
string s = "123"; cout << int(s[0]);erreicht man den ASCII-Tabellenwert von '1', also 49. Zieht man nun den Wert von '0' ab, also 48, erhält man 49-48, also 1. Das gilt dann logischerweise auch für die anderen Ziffern.
So erhält man also die Werte, blöd nur, das man die nicht einfach so in einen int reinschreiben kann (1+2+3+4 = 10, nicht 1234). Man macht also
10 * 0 + 1 = 1
10 * 1 + 2 = 12
10 * 12 + 3 = 123
...Das ganze dann noch in eine Funktion verpacken, und so siehts dann aus:
#include <iostream> int stringZuInt(const std::string& s) //als Referenz um nicht kopieren zu müssen, const um zu sagen, { //dass nichts verändert wird int zahl = 0; for(unsigned i = 0; i < s.length(); ++i) zahl = (zahl * 10) + (s[i] - '0'); //wie besprochen return zahl; } int main() { std::cout << stringZuInt("321"); }Dann weiß man wenigstens, was hinter den Kulissen passiert.
-
SeppJ schrieb:
Um mal Butter bei die Fische zu tun und das ganze Halbwissen im Thread besser zu erklären:
[...]
Aber am Ergebnis würde das doch nichts ändern, weil in dem String keine Zahl steht?!
-
Belli schrieb:
SeppJ schrieb:
Um mal Butter bei die Fische zu tun und das ganze Halbwissen im Thread besser zu erklären:
[...]
Aber am Ergebnis würde das doch nichts ändern, weil in dem String keine Zahl steht?!
Doch! Das eine Mal bekommt man 0, also false, das andere Mal !0, also true! Also gegenteiliges Ergebnis und das ist auch, was den Threadersteller überraschte. Außerdem passiert etwas gänzlich anderes als erwartet, da überhaupt keine Leseaktion versucht wird, sondern stattdessen ein bisschen das Integerrechenwerk belastet wird!
Der Unterschied ist also ganz fatal!
-
@Incocnito teste mal deinen schwachsinn mit BUCHSTABEN nicht mit ZAHLEN
er hat absichtlich ASCII genommen fällt dir das nicht irgendwie auf??????? omfg
deine func macht absolut keinen sinn

-
In C++11 gibt es übrigens std::stoi dafür. Das wirft in dem Fall einfach eine Exception.
-
rüdiger schrieb:
In C++11 gibt es übrigens std::stoi dafür. Das wirft in dem Fall einfach eine Exception.
Die trauen sich jetzt sogar einfach so Exceptions zu werfen.

-
Leute, nehmt einfach boost::lexical_cast. Das funktioniert in beide Richtungen und ist deutlich schneller als euer Stringstream zeugs, wirft auch eine Exception (boost::bad_lexical_cast) und kann sogut wie alle Basisdatentypen hin und her konvertieren ((Edit) Auch Strings zu solchen und umgekehrt).