Wie erstell ich eine Bedingung bei der die Eingabe eine Zahl sein muss?
-
$ ./a.out -123 zeichen
Ups.
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(...) >> myString
wä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(...) >> myString
wäre aber erst mit C++11 möglich, weil dieseroperator>>
eine freie Funktion ist.Stimmt.
Danke dir