String Zahlen filtern
-
@MFK mein Prog funktioniert dennoch nicht
@brotbernd verstehe nicht wofür die string variable out dienen soll ?!?
-
Dort wird das Ergebnis gespeichert. Du kannst auch das erase remove idiom auf den original string anweden:
http://en.wikipedia.org/wiki/Erase-remove_idiomint main() { std::string in = "Ha3llo3241blieba!"; in.erase(std::remove_if(in.begin(), in.end(), NotDigit<char>()), in.end()); int i = atoi(in.c_str()); std::cout << i; std::cin.get(); return 0; }
-
-
Ich habe eine Fehlermeldung die leider sehr ungenau ist?
und zwar :
[cpp
template<typename Char>
struct NotDigit
{
bool operator()(Char c) const
{
return !std::isdigit(c, l); //Compiler sagt: at this point
}
std::locale l; // Ist das ein L wie ludwig oder eine Ziffer ?
};cpp]
-
undercover321 schrieb:
Compiler sagt: at this point
Das ist nicht die ganze Meldung.
-
Ja das ist ein kleines L(udwig). Kopier es doch einfach! Und inkludiere alle header.
Und nochmal mit streams statt atoi#include <iostream> #include <string> #include <locale> #include <algorithm> #include <sstream> #include <iterator> template<typename Char> struct NotDigit { bool operator()(Char c) const { return !std::isdigit(c, l); } std::locale l; }; int main() { std::string in = "Ha234blbi7eba!"; std::stringstream out; std::remove_copy_if(in.begin(), in.end(), std::ostream_iterator<char>(out), NotDigit<char>()); int i = 0; if (out >> i) std::cout << i; else std::cout << "Das hat nicht geklappt."; return 0; }
-
also der Compiler nörgelt und sagt mir genau das:
Multiple markers ath this line: -at this point in fileist das die Felhermeldung ?!
-
@brotbernd: Also mit dem anderen Code funktioniert es jetzt
Vielen herzlichen Dank! Was ist der unterschied ob ich nun atoi oder sstream verwende ?!?
-
Ich kann dass nicht ganz glauben, dass undercover321 aus einem String wie "Ha234blbi7eba!" die Zahl 2347 lesen möchte, wenn ja - wo kommen dann derartige Zeichenfolgen her?
Falls Du an den Zahlen 234 und 7 aus dem String interessiert bist, so würde ich Dir einen sogenannten Manipulator empfehlen, der alles überliest, was keine Ziffer ist.
#include <iostream> #include <sstream> #include <locale> std::istream& skipnodigit( std::istream& in ) // ueberliest alles, was keine Ziffer ist { std::istream::sentry ok( in ); if( ok ) { const std::ctype< char >& ctype_ = std::use_facet< std::ctype< char > >( in.getloc() ); for( std::istream::int_type m = in.rdbuf()->sgetc(); ; m = in.rdbuf()->snextc() ) { typedef std::istream::traits_type Traits; if( Traits::eq_int_type( m, Traits::eof() ) ) { in.setstate( std::ios_base::eofbit ); break; } if( ctype_.is( std::ctype_base::digit, Traits::to_char_type( m ) ) ) break; } } return in; } int main() { using namespace std; istringstream buf("Ha234blbi7eba!"); for( int zahl; buf >> skipnodigit >> zahl; ) cout << zahl << endl; return 0; }
Die Ausgabe ist bei diesem Programm
234 7
:xmas2: Werner
-
atoi ist eine Funktion aus der C Standardbibliothek (
#include <cstdlib>
fehlte da eigentlich noch). Wenn sie fehl schlägt, gibt sie einfach 0 zurück. Der C++ Weg für solche Konvertierungen sind eigentlich eher die streams. Gekapselt in einem praktischen Funktionstemplate gibt es das inboost::lexical_cast
.
-
Werner Salomon schrieb:
:xmas2: Werner
auch sehr schön
-
Ich danke euch recht herzlich für so einen Support! Ihr habt mir schon mehr als genüge getan und es funktioniert alles Prima....
Seit alle echt SUPER!!! Großes lob