c++ abfrage, wenn die eingabe ein Buchstabe ist

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Mir fallen spontan 2 Möglichkeiten ein (je nach Anwendungsfall). Sind beide zwar nur C-Lösungen aber die gehen auch und bei Bedarf gibt es sicher auch eine C++ Lösung.

Wie liest du das Ergebnis ein? mit getch() oder mit cin?

Bei getch() (wenn du also nur ein einzelnes Zeichen einlesen willst) wäre die einfachste Lösung zu überprüfen ob der Wert zwischen '0' und '9' liegt. Also:

char x = getch();
int wert;
if  (x < '0' || x > '9') {
    // Fehler
}
else {
    wert = x-'0';
}

(keine Garantie für Syntaxfehler, es geht hier um die Idee)

Falls du einen kompletten string parsen willst nimm strtol(), sscanf() oder irgendwas was von der STL (adhoc keine Idee was es da gibt, aber da gibt es garantiert was) und überprüfe die Rückgabewerte.

Pischi 
Fragesteller
 15.07.2013, 21:11

Eingelesen wird das ganze mit dem cin Befehl.

0
reddox86  15.07.2013, 21:27
@Pischi

Dann probier es mal mit folgendem:

std::string input;
int result, zahl;

std::cin>>input;
result = sscanf("%d", input.c_str(), &zahl);
if(result == 0 || result == EOF) {
    // Fehler
}
else {
    // in zahl steht das Ergebnis
}

Müsste in etwa so funktionieren. Habe grade keinen Compiler installiert, kann es also nicht ausprobieren (bin mir etwas unsicher ob 0 oder EOF gebraucht wird und ob EOF schon bekannt ist, wenn man die stdio.h eingebunden hat).

Ich glaube aber, dass es trotzdem Probleme gibt - wenn ich mich recht erinnere intereptiert cin Whitespaces (also u.a. Leerzeichen) als neue Zeilen (also wenn du z.B. "12 31 432 1" eingibst, bräuchtest du 4 cin hintereinander um jede einzelne Zahl einzulesen) Das ist zwar relativ einfach zu lösen, aber etwas komplizierter (und da müsste ich definitiv was mit dem Compiler probieren, weil ich da jetzt nicht 100%ig im Thema bin)

PS: ich seh gerade das GF meinen Code verschandelt...

>

soll hier '>' heißen.

0
reddox86  15.07.2013, 21:31
@reddox86

Und plötzlich funktioniert es wieder...wtf...Ignorier mein PS xD

0
reddox86  16.07.2013, 17:02
@reddox86

Ich habe den Code nochmal eingehämmert und getestet und mir ist ein grober Fehler aufgefallen...es muss heißen:

result = sscanf(input.c_str(), "%d", &zahl);

Aber dann wird auch etwas wie 123d gematched (als 123) was ja nicht besonders schick ist. Ein Workaround währe folgender Code:

std::string input;
int result, zahl;
char dmy;

std::cin>>input;
result = sscanf("%d%c", input.c_str(), &zahl, %dmy);
if(result != 1) {
    // Fehler
}
else {
    // in zahl steht das Ergebnis
}

Das funktioniert so, dass er versucht eine Zahl und ein Zeichen zu matchen. Wenn es ein Matchingergebnis ist, ist gut, dann haben wir nur eine Zahl. Findet er 2 (Zahl+irgendwas anderes hinten dran) oder 0 (fängt nicht mit einer Ziffer an) Ergebnisse gibt es einen Fehler. Das ist aber definitiv keine schöne Lösung (und ich bin sicher, dass es selbst mit sscanf() besser geht (ich würde so etwas in keinen meiner Codes stehen lassen, weil man später wahrscheinlich nicht mehr weiß was man damit bezweckt hat). Schöner wären aber Lösungen mit strtol(), oder noch schicker finde ich die Lösung von dergutekoenig, wenn du einen passenden Compiler zur Verfügung hast.

0

einfach mit isdigit prüfen:

int isdigit ( int c );

Einfach

if else {

cout << "ungültige Eingabe" endl; //oder wie auch immer die Fehlermeldung aussehen soll

}

Filereal  15.07.2013, 16:24

Das kommt wenn man etwas anderes eingibt als eine der möglichen Antwortmöglichkeiten (z.B. 1-4 oder wie auch immer)

Oder du schreibst:

if (a = a,b,c,....) // ich hab einfach a genommen, einfach deine Variable einsetzen, nach c.... musst du natürlich bis z weiterschreiben...

{

cout << "Ungültige Eingabe" << endl;

}

0
Pischi 
Fragesteller
 15.07.2013, 16:27

if else was? Ich hab so einen Code: if (zahl1 > zahl2) { cout << zahl1 << " ist groesser als " << zahl2 << endl; } else if (zahl1 < zahl2) { cout << zahl1 << " ist kleiner als " << zahl2 << endl; } else und wenn ich bei zahl1 statt eine zahl eingebe ein buchstaben dann kommt da beim ergebnis irgendein zahl wo er nichtmal weiß was das für eine ist.

0
Filereal  15.07.2013, 17:00
@Pischi

Oh...

Dann ist es etwas komplizierter, da du ja keine vorgegebenen Antwortmöglichkeiten hast...

Dann musst du noch anhängen:

else if (zahl1 = a, b, c und so weiter bis z)

cout << "ungültige Eingabe" << endl;

Wenn du zahl2 auch noch per cin >> eingibt musst du das gleiche noch für zahl2 eingeben...

0
Pischi 
Fragesteller
 15.07.2013, 17:07
@Filereal

Dann kommt, dass a,b,c und so ein nichtdeklarierter Bezeichner sind.

0

Hier habe ich eine schöne, elegante Methode gefunden, allerdings ist das C++11, das muss man vielen Compilern explizit sagen (der gcc zum Beispiel kompiliert sowas mit der Option "-std=c++11"):

bool isNumeric(const std::string& input) {
    return std::all_of(input.begin(), input.end(), ::isdigit);
}

Für string musst natürlich noch der entsprechende Header eingebunden werden:

#include<string>