Zeichen von Strings entfernen
-
Abend zusammen
Mein Ziel ist es aus einem c++ string alle Buchstaben und Zeichen zu entfernen. Dadurch kann ich den string in ein int umwandeln.
Habe schon gesucht und nichts gefunden. Meine Idee: Man könnte mit einer Schleife und string.replace die ASCII Tabelle durchlaufen lassen und jedes Zeichen durch '' ersetzen? Nur weiss ich nicht genau wie man das Funktionstüchtig umsetzt.
Wie würdet ihr das Problem lösen?
Gruss
-
was ist mit solchen ketten?
"zz55aa33aa1-"
-
Solche Ketten werden nicht vorkommen
In meinen strings steht sowas wie: 100 kW oder 20000 km
Leider war ich zu Faul die Zahlen von den Masseinheiten zu trennenUnd jetzt hab ich keine Lust mehr alles umzuschreiben
-
also soweit ich weiss ignoriert atof und atoi die zeichen ausser den zahlen...
aber du könntest substrings oder erase benutzen
string str = "23535 km"; string s1, s2; s1 = str.substr(0, 5); s2 = str; for(int i = 0; i < s2.length(); ++i) if ( s2[i] == 'a' || s2[i] == 'b' ... || s2[i] == zeichen ) // hier kann man gut eine funktions chreiben s2.erase(i);
das sind 2möglichkeiten
die zweite musst du antürlich nochr ichtig schreiben
-
std::stringstream bla("100km"); int zahl; bla>>zahl; std::cout<<zahl;
-
Alle Zeichen eines Strings haben einen Integer-ASCII-Wert. Programmiere eine Schleife und ingnoriere alles, was keine Ziffer ist.
-
s.erase( remove_if( s.begin(), s.end(), not1( pointer_to_unary_function<int, int>( isdigit ) ) ), s.end() );
-
MFK schrieb:
s.erase( remove_if( s.begin(), s.end(), not1( pointer_to_unary_function<int, int>( isdigit ) ) ), s.end() );
Es scheint in letzter Zeit Mode geworden zu sein, möglichst viele STL-Funktionen in eine Zeile Code zu packen
-
kann gut sein
ich hab noch nicht viel mit der STL zu tun gehabt und kann dmait kaum was anfangen
-
Nexus schrieb:
Es scheint in letzter Zeit Mode geworden zu sein, möglichst viele STL-Funktionen in eine Zeile Code zu packen
Ja, das wird leider schnell unübersichtlich.
Wichtig ist eigentlich nur
remove_if not1 isdigit
Das hingegen ist schon fast wieder Klartext
Erase braucht man nur, weil remove(_if) nicht wirklich etwas entfernt, und pointer_to_unary_function brauchte ich, weil not1 nur mit unären Funktionsobjekten arbeiten kann, nicht mit Funktionszeigern. Möglicherweise lässt sich das im neuen Standard viel einfacher schreiben.
-
Es gäbe noch eine kleine Möglichkeit, die Sache zu vereinfachen:
/* ... */ pointer_to_unary_function<int, int>( isdigit ) /* ... */ // Dieses DING könnte man ersetzen durch: /* ... */ ptr_fun(&isdigit) /* ... */
So ist es etwas kompakter
Und wenn man die Sache vielleicht auch noch auseinander schreibt, dann kann man es sogar anfangen zu lesen.
#include <cctype> #include <string> #include <algorithm> #include <functional> // ... std::string::iterator endOfRange = std::remove_if(str.begin(), str.end(), std::not1(std::ptr_fun(&isdigit))); str.erase(endOfRange, str.end());
Und wie denkst du, dass im neuen Standard das einfacher gehen wird? Über Lambda-Ausdrücke?
std::string::iterator endOfRange = std::remove_if(str.begin(), str.end(), [](char c) -> bool { return !isdigit(c); } );
Naja, derzeit geht es aber wohl am einfachsten mit boost:
#include <string> #include <boost/algorithm/string_regex.hpp> // ... std::string str; // Der String boost::algorithm::erase_all_regex(str, boost::regex("\\D+"));
Und für das eigentlich Problem, wo es nur darum ging, die Buchstaben am Ende wegzunehmen, wurde auch schon eine einfachere Lösung gezeigt
Ansonsten hier vielleicht noch eine weiter:std::string str; str.erase(str.find_first_not_of("0123456789"));
Oder noch eine mit Boost:
#include <string> #include <boost/algorithm/string.hpp> // ... std::string str; boost::algorithm::trim_right_if(str, !boost::algorithm::is_digit());
Grüssli