Wie erstell ich eine Bedingung bei der die Eingabe eine Zahl sein muss?
-
Hey Leute,
Die Frage steht bereits oben.
Und zwar möchte ich das eine Zahl eingegeben wird und wenn ein Buchstabe eingegeben wird dann soll etwas anderes geschehen:
cin >> Eingabe;
getchar ();
if (Eingabe= _____)
{ ... }
else
{...}
Bei dem Unterstrich soll die Bedingung eingeführt werden
dass eine Ganzzahlige Zahl eingegeben werden muss
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
#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 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