Eingabeüberprüfung Verständniss
-
hay
ich versuche grade mein Wissen zu erweitern leider hab ich Verständnissprobleme mit der Eingabenüberprüfung. Ich hab hier ein kleines Programm udn versuch da eine Eingabenüberprüfung reinzu programmieren. Leider funktioneirt es nicht so wie ich es haben wollte. Das Programm sollte eigentlich bei einem Buchstaben eine falsche Ausgabe geben und bei richtiger Eingabe weitermachen. Leider ist es immer eine Falche Ausgabe und bei eienr INT eingabe muss ich immer 2 Zeichen geben. Könnt ihr mir erklären was ich hier falsch gemacht habe und mir erklären wieso das genau passiert?
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {
int auswahl, ok;
char eeu;printf("Was moechten Sie berechnen? \n1 = Weg \n2 = Geschwindigkeit \n3 = Zeit ");
ok = (!scanf("%d%c", &auswahl, &eeu));if(!scanf("%d", &auswahl));
{
printf("\nFalche Eingabe! ");
}
if(auswahl == 1)
{
printf("\nSie haben den Weg gewaehlt! ");
}if(auswahl == 2)
{
printf("\nSie haben die Geschwindigkeit gewaehlt! ");
}return 0;
}Dev++
PS: mit == && versucht aber auch nicht so auf die Ketten bekommen :(.
-
Wenn du 2x scanf aufrufst, brauchst du dich nicht wundern, wenn du auch 2 Eingaben machen musst.
Das !scanf hast du sicher irgendwo aufgeschnappt ohne zu wissen, was da passiert.
Für deinen Anwendungsfall mit int-Eingaben bietet sich einfach scanf("%d" mit anschließendem switch/case an, wo du einen Fehlerfall auch sehr einfach abhandeln kannst:int i; scanf("%d",&i); while( getchar()!='\n' ); switch (i) { case 1: case 2: case 3: default: /* Fehler */ }
-
dankeschön^^
-
dies hält aber nur davon ab das ich mehr als 1 Zeichen nicht eingeben darf oder? Also wenn ich einen Buchstaben eingebe wird bei mir das erste Case angesteuert.
-
Der Rückgabewert von scanf enthält die Anzahl erfolgreich eingelesener Felder. Wenn scanf in deinem Fall etwas anderes als 1 zurückgibt, ist ein Fehler aufgetreten. Also ein Buchstabe statt einer Ziffer zum Beispiel.
-
i enthält (hier) aber nicht den Rückgabewert von
scanf
.
Wennscanf
keine vernünftige Eingabe für i vofindet, bleibt i unverändert.
Da i hier nicht initialisert ist, ist es Zufall was da zuerst drin steht.Du kannst vor dem
scanf
i eine 0 zuweisen.
-
Habe glaube gelesen, dass bei C++ (im gegensatz zu C) die Werte bei Definition implizit initialisiert werden?
-
deejey schrieb:
Habe glaube gelesen, dass bei C++ (im gegensatz zu C) die Werte bei Definition implizit initialisiert werden?
Selbst wenn das so wäre, hier geht es um C.
-
stimmt, mein Fehler
-
eine kleine Frage noch zum verständniss. Was genau heißt hier !='\n' das Ausrufezeichen? Es ist ein Non - Operator der ja nur false or true annehmen kann. Aber was genau tut er? Wie erkennt er das ? Und wan ist es sinnvoll diesen einzusetzen? tut mir leid wen ich so viele Fragen stelle aber ich möchte genau wissen was ich dahin schreibe. Ich versuch irgendwie den Logischen einsatz von Zeichen verstehen was die genau tun.
-
Das ist != (Ausrufe-Gleicheitszeichen) und steht für den Vergleich auf Ungleichheit.
-
alles kla dankeschön. Ich hab das Programm jetz fertig geschrieben aber 1 Sache fehlt da noch. Ich möchte gerne dem nutzer die Möglichkeit geben seine Entscheidung wieder rückgangig zumachen. ZB der Nutzer wählt die 1 zur Berechnung und möchte nun seine Entscheidung auf 2 setzen. Das heißt das Programm müsste in der Lage sein ein Schritt zurückzumachen. Wie setz ich sowas genau ein? mit break , continoue oder doch das return?
mfg Speedy
-
Solange der Nutzer die Entertaste noch nicht gedrückt hat, kann er editieren.
Danach ist die Eingabe gültig.Was du dann in deinem Programm machst, ist deine Sache.
break
verlässt eine Schleife oder switch-Anweisung
continue
geht direkt zum nächsten Schleifendurchlauf
return
verlässt eine FunktionOhne Schleife bringt das nicht viel.
Eine idiotensichere Eingabe ist nicht trivial zu machen.
Fragen wie "Wollen sie nochmal die Eingabe ändern" sind lästig.
Du brauchst ein Menüsystem oder eine GUI (geht auch als Text, z.B. mit ncurses)