Wie erstell ich eine Bedingung bei der die Eingabe eine Zahl sein muss?
-
#include <cctype> #include <iostream> #include <string> int main() { //einlesen std::string input; std::cin >> input; bool is_digit = true; // anfangs: ganzahl for (auto c : input) // jedes zeichen in input checken if (!std::isdigit(c)) // sobald die erste nicht-Zahl auftaucht... { is_digit = false; // als zeichen kennzeichnen break; // schleife verlassen } if (is_digit) // wenn zahl std::cout << "zahl"; else // keine zahl std::cout << "zeichen"; }
-
$ ./a.out -123 zeichenUps.
Die einfachste Methode ist wohl
#include <iostream> #include <limits> #include <string> ... int x; // bzw. double x; if(std::cin >> x) { // Zahl } else { std::string s; std::cin.clear(); std::cin >> s; std::cerr << s << " ist keine Zahl.\n"; } // Wenn zeilenbasierte Eingabe gewollt ist: Rest der Zeile verwerfen. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');Für zeilenweise Eingabe auch möglich:
#include <iostream> #include <sstream> #include <string> ... std::string line; int x; std::getline(std::cin, line); if(std::istringstream(line) >> x) { // Zahl } else { // line ist keine Zahl. }
-
Na ja, bei deinen Lösungen werden Eingaben wie 123abc als zahl eingestuft und abc muss gelöscht werden.
Wenn der TE will, dass 123abc als Zeichen eingestuft wird, ist meine Lösung besser.
-
seldon schrieb:
if(std::istringstream(line) >> x) {Das hier geht aber erst seit C++11, oder?
-
Ich glaube schon.
Meine Lösung braucht aber auch C++11.
-
out schrieb:
Das hier geht aber erst seit C++11, oder?
Nein, wieso?
-
Nexus schrieb:
out schrieb:
Das hier geht aber erst seit C++11, oder?
Nein, wieso?
Hier wird doch ein temopräres Objekt erzeugt und operator>> nimmt doch nicht const-ref entgegegen?
-
Oder ganz simpel:
#include <iostream> #include <string> using namespace std; int main() { string eingabe; cin >> eingabe; if(eingabe.find_first_not_of("0123456789" == string::npos) cout << "Zahl !\n"; else cout << "Etwas Anderes !\n"; }
-
Ethon schrieb:
Oder ganz simpel:
[code="cpp"]#include <iostream>
#include <string>
using namespace std;int main()
{
string eingabe;
cin >> eingabe;
if(eingabe.find_first_not_of("0123456789") == string::npos)
cout << "Zahl !\n";
else
cout << "Etwas Anderes !\n";
}[/code]
Stimmt, std::string hat ja so tolle Suchfunktionen.
-
out schrieb:
Hier wird doch ein temopräres Objekt erzeugt und operator>> nimmt doch nicht const-ref entgegegen?
Nein, die
int-Überladung vonoperator>>ist ein Member vonstd::istringstream. Sowas ging schon mit C++98, sah man teilweise auch bei Copy-and-Swap:MyClass(origin).swap(*this);std::istringstream(...) >> myStringwäre aber erst mit C++11 möglich, weil dieseroperator>>eine freie Funktion ist.
-
Nexus schrieb:
out schrieb:
Hier wird doch ein temopräres Objekt erzeugt und operator>> nimmt doch nicht const-ref entgegegen?
Nein, die
int-Überladung vonoperator>>ist ein Member vonstd::istringstream. Sowas ging schon mit C++98, sah man teilweise auch bei Copy-and-Swap:MyClass(origin).swap(*this);Grad als du es geschrieben hast, habs ichs auch gesehen. Hier wird ja
istream::operator>>(int&)aufgerufen... klar dann gehts.
Nexus schrieb:
std::istringstream(...) >> myStringwäre aber erst mit C++11 möglich, weil dieseroperator>>eine freie Funktion ist.Stimmt.
Danke dir
