String zu Integer
-
Hallo,
ich habe bei meinem neuesten Projekt ein Problem:
ich habe in einem String am Anfang eine Zeichenfolge, danach kommen ein paar Zahlen und wieder eine Zeichenfolge. Also so:
blabla123blabla.
Wie kann ich nun die Zahlen herausfiltern und in einer Integer-Variable speichern?
-
du löscht alle zeichen raus (also lässt nur die zahlen stehen) oder du holst dir die zahlen raus
#include <string> #include <sstream> using namespace std; int main() { string str = "blabla123blabla"; stringstream ss; for(UINT i = 0; i < str.size(); ++i) { if ( isNumeric(str[i]) ) ss << str[i]; } int zahl; ss >> zahl; return 0x0; }so in etwa wäre eine möglichkeit, ob das isNumeric so richtig weis ich nicht genau, kannst dir zur not ja ne eigene funktione schreiben
-
Skym0sh0 schrieb:
so in etwa wäre eine möglichkeit, ob das isNumeric so richtig weis ich nicht genau, kannst dir zur not ja ne eigene funktione schreiben
Die Funktion nennt sich isdigit(). Und ich würde mir mit find_if() den Anfang und das Ende der Zahl aus diesem Eingabestring herausholen.
-
Hey, das ging ja richtig schnell! Geschätze halbe Stunde!

Danke für eure Antworten!
-
Hey, das ging ja richtig schnell! Geschätze halbe Stunde!

Danke für eure Antworten!EDIT:
Warum steht mein Beitrag jetzt zweimal da?
-
CStoll schrieb:
Skym0sh0 schrieb:
so in etwa wäre eine möglichkeit, ob das isNumeric so richtig weis ich nicht genau, kannst dir zur not ja ne eigene funktione schreiben
Die Funktion nennt sich isdigit(). Und ich würde mir mit find_if() den Anfang und das Ende der Zahl aus diesem Eingabestring herausholen.
ja dass es so eine möglichkeit gibt ist mir klar, aber ich hab den ganzen stl kram leider noch nicht gut drauf und deswegen hab ich ihm die Q&D lösung gegeben
-
Wobei, im Nachhinein fällt auf, daß der find_if)-Ansatz eventuell andere Ergebnisse liefert als deine Schleife - die würde am ehesten einem remove_if() entsprechen.
@JP: Kann es eigentlich vorkommen, daß die Eingabe mehrere Ziffernblöcke enthält (z.B. "bla12blub34weiter")? Wenn ja, was soll in so einem Fall ausgegeben werden (bei dem obigen steht die Auswahl zwischen 12, 34, 1234 und "was willst du von mir?")?
PS: schlecht geschätzt - das waren im Bestfall 18 Minuten

-
CStoll schrieb:
Wobei, im Nachhinein fällt auf, daß der find_if)-Ansatz eventuell andere Ergebnisse liefert als deine Schleife - die würde am ehesten einem remove_if() entsprechen.
@JP: Kann es eigentlich vorkommen, daß die Eingabe mehrere Ziffernblöcke enthält (z.B. "bla12blub34weiter")? Wenn ja, was soll in so einem Fall ausgegeben werden (bei dem obigen steht die Auswahl zwischen 12, 34, 1234 und "was willst du von mir?")?
PS: schlecht geschätzt - das waren im Bestfall 18 Minuten

Hallo!
Nein, es kann nicht vorkommen das der String mehrere Ziffernblöcke enthält! (Außer jemand benutzt mein Programm falsch :D)
Könntest du mir noch einmal ein Beispiel zu isDigit() geben? Ich habe das schon ausprobiert, aber irgendwas mache ich falsch
PS: Sagen wir zwanzig Minuten!

-
Das Beispiel würde genauso aussehen wie das von Sky, nur daß du das IsNumeric ersetzen mußt durch isdigit (komplett klein geschrieben) - außerdem benötigst du dafür ein
#include <cctype>am Programmanfang. Eine Lösung mit STL-Algorithmen wäre:string Eingabe; // = "bla123blub" string::iterator start = find_if(Eingabe.begin(),Eingabe.end(),isdigit); string::iterator ende = find_if(start,Eingabe.end(),not1(isdigit)); string Zahl(start,ende); //wie's weiter geht, siehe FAQ(Edit: dafür benötigst du <algorithm> und <functional>)
-
Es läuft!

Nur musste ich in der for Schleife statt UINT einen ganz normalen Integer nehmen und das ++i durch ein i++ ersetzen. ++i? Hmm... Noch nie davon gehört!
Der Quellcode (für die Nachwelt):#include <string> #include <sstream> #include <cctype> #include <iostream> using namespace std; int main () { string str = "<test>123456789</test>"; stringstream ss; for(int i = 0; i < str.size(); i++) { if ( isdigit(str[i]) ) ss << str[i]; } int zahl; ss >> zahl; cout << zahl; }
-
eigentlich wäre size_t noch besser für die Variable. Und ++i und i++ ist in diesem Zusammenhang eigentlich gleichwertig (die unterscheiden sich nur in ihrem Rückgabewert, Stichwort: Pre-Inkrement vs. Post-Inkrement).