string zu integer
-
xxmaxx schrieb:
ja ok aber wie kann ich dann den string am besten in einen integer wandeln?
Dafür haben wir einen Artikel in der FAQ, der einige Ansätze zur Auswahl stellt.
PS: Daß jemand code-Tags für Zitate verwendet, ist mir auch neu

-
Am einfachsten mit atoi. Du kannst aber auch stringstreams benutzen (geht dann auch mit >>). Sie auch den Eintrag in der FAQ: http://www.c-plusplus.net/forum/39488
-
string -> c_str() -> atoi() -> intoder mit
std::stringstream sstr(myString); int Zahl; sstr >> Zahl;Grüße,
Rewind.
-
Und hier für ALLE Typen. Einfach, weil ich Langeweile hab.
template<typename T> T convert(const std::string& str) { T x; std::stringstream ss(str); str >> x; return x; } int x = convert<int>("100 Elefanten rennen durch den Garten");
-
atoi wär eine lösung, darf ich aber nicht verwenden. wenn ich das mit stringstream mache:
getline(file, str_number); std::stringstream sstr(str_number); sstr >> int_number;kann ich ja gleich schreiben
file>> int_number;weil in beiden fällen wird wenn die zeile leer ist bis zum nächsten wert
gesprungen und der dann eingelesen.
ausserdem will ich auch falsche werte erkennen wie 10A3. Hierbei wird
dann ja nur bis zum A eingelesen und mein integer wert wäre 10. gibt es
in c++ keine alternative zu atoi?
-
Was spricht denn dagegen, wenn du vor der Umwandlung noch nachsiehst, ob der String überhaupt gefüllt wurde?
xxmaxx schrieb:
weil in beiden fällen wird wenn die zeile leer ist bis zum nächsten wert gesprungen und der dann eingelesen.
Nein, beim Stringstream bestimmt nicht - der kennt nur die aktuelle Zeile der Datei.
ausserdem will ich auch falsche werte erkennen wie 10A3. Hierbei wird
dann ja nur bis zum A eingelesen und mein integer wert wäre 10. gibt es
in c++ keine alternative zu atoi?Da wäre eventuell strtol() für dich geeignet - das gibt auch zurück, wieviel von der Eingabe es verarbeiten konnte.
-
Was spricht denn dagegen, wenn du vor der Umwandlung noch nachsiehst, ob der String überhaupt gefüllt wurde?
ja mach ich auch. nur hilft mir das bei 10A0 nicht viel.
Nein, beim Stringstream bestimmt nicht - der kennt nur die aktuelle Zeile der Datei.
stimmt. hab ich mich geirrt.
Da wäre eventuell strtol() für dich geeignet - das gibt auch zurück, wieviel von der Eingabe es verarbeiten konnte.
ist nicht besser als atoi da ich im c++ style bleiben soll.
vielen dank auch. ich werd mir da jetzt mit stringstream was zusammen
bauen
-
xxmaxx schrieb:
ist nicht besser als atoi da ich im c++ style bleiben soll.
Na gut, wie wäre es mit sowas:
stringstream conv(zeile); int wert; conv>>wert; if(conv.peek() != EOF) //Fehler - überflüssige Werte im String
-
Ich habe ein wenig das Gefühl, dass bei derartigen Threads wie hier manchmal am Thema vorbeigeredet wird.
xxmaxx schrieb:
ich möchte auch die leerzeilen erkennen können.
Was machst Du mit den 'erkannten Leerzeilen'?
oder besser: gib mal ein Beispiel so einer Datei an. Und wie sieht die Datenstruktur aus, mit der - nach(!) dem Einlesen und interpretieren - dann innerhalb des Programms weiter gearbeitet wird?
Was wäre der Unterschied in der Bedeutung zwischen
12 13 14und
12 13 14?
-
Hallo Eisflamme,
bei deiner convert-Funktion wäre es noch besser, wenn man explizit
T x = T();verwendet, da hiermit auch POD-Typen explizit initialisiert werden (d.h. mit 0), so daß bei einem Fehler dieser als Wert zurückgegeben wird, anstatt ein uninitialisierter (zufälliger) Wert.
(Nachteil wiederum ist, daß jetzt ein öffentlicher Kopierkonstruktor verfügbar sein muß, selbst wenn dieser wegoptimiert wird - ich meine @camper hatte neulich dies so geschrieben.)Es mag sein, daß der Standard dies explizit auch bei "T x" so verlangt, aber zwei Compiler, die ich mal verwendet hatte (BCB 5, VC7) haben diese Initialisierung nicht vorgenommen.