Eingabe Überprüfen in C

vom 08.12.2008, 00:21 Uhr

Ich würde unten angegebene Funktion gerne dadurch erweitern, dass nach auslesen der Variable n geprüft wird, ob eine Zahl von 0-5 eingegeben wurde. Aktuell wird wenn ich einen Buchstaben eingebe eine Endlosschleife erzeugt, die ich mir nicht erklären kann. Kann mir einer weiterhelfen?

Code: Alles auswählen
void input_routine() {
     int n=1;
     int m;
     while (n!=0) {
           system("cls");
           printf("\t\t   Was wollen Sie tun?\n\n");
           printf("\tEin Element an die Liste haengen.\t(1)\n");
           printf("\tEin Element aus der Liste loeschen.\t(2)\n");
           printf("\tDie Liste ausgeben.\t\t\t(3)\n");
           printf("\tDie Liste abspeichern.\t\t\t(4)\n");
           printf("\tEine Liste laden.\t\t\t(5)\n");
           printf("\tBeenden.\t\t\t\t(0)\n");
           scanf("%i",&n);
           switch(n) {
                     case (1): {
                          printf("\n\tWas wollen sie anhaengen?");
                          scanf("%i",&m);
                          append(&list,m);
                          break;
                          }
                     case (2): {
                          printf("\n\tWelches Element wollen sie loeschen?");
                          scanf("%i",&m);
                          remove_n(&list,m);
                          break;
                          }
                     case (3): {
                         printf("\n\tListe:\n\n");
                         printlist(list);
                         system("Pause");
                         break;
                         }
                     case (4) : {
                          printf("Nicht implementiert.");
                          system("Pause");
                          break;
                          }
                     case (5) : {
                          printf("Nicht implementiert.");
                          system("Pause");
                          break;
                          }
                     case (0) : {
                          break;
                          }
           }
           }
}

» weeska » Beiträge: 85 » Talkpoints: 1,36 »



Auf die schnelle würd ichs mit ner if-Schleife machen.

also nach deinem scanf(); einfach if(n<0 || n>5){
printf"Funktionsaufruf ungueltig Bitte Ganzzahl zw. 0 und 5 eingeben\n");
}
else
{ /*Den Rest von deinem Programm*/
}

Also sprich so hätte ich mir das ganze vorgestellt. Ich bin jetzt einfach einmal davon ausgegangen, dass der Rest funktioniert.

» Leviathan » Beiträge: 26 » Talkpoints: 0,21 »


Kann sein, dass das nicht genau rüber kam, aber ich wollte mehr die Überprüfung haben, ob eine Zahl eingegeben wurde, und nicht zum Beispiel ein Buchstabe oder ähnliches.

Oder funktioniert das ganze damit auch? Scheint irgendwie nicht ganz zu gehen :?

» weeska » Beiträge: 85 » Talkpoints: 1,36 »



Gehen wir mal alles der Reihe nach durch:

- Es kann ein Zeichen eingegeben werden, dass keine Zahl ist.
- Es kann eine Zahl eingegeben werde. Hier unterscheiden wir wieder zwei Fälle:
=> Eine Zahl zwischen 1 und 5
=> Eine Zahl kleiner 1 oder größer 5.

Jetzt musst fängst Du alle Zahlen außer 1,2,3,4,5 ja über die SwitchCases ab. Einfach mit einem default Case. Und dann musst Du noch sicher gehen, dass das Zeichen ein Integer ist. Dazu gibt es wieder zwei Möglichkeiten. Entweder Du verhinderst die Eingabe von einer Zahl, die keine Ganzzahl ist, oder Du prüfst im Nachhinein was eingegeben wurde. Ich würde Dir empfehlen einfach die Platzhalter in der scanf() Funktion (da hast Du %i verwendet) durch %d zu ersetzen, dann akzeptiert die Eingabe nur eine Ganzzahl und Du hast das Problem schon im Vornerein gelöst. Die Alternative ist etwas komplizierter. Die kann ich Dir ja noch erläutern falls Du mit meiner Lösung nicht so zufrieden bist.

Grüße

» listen_and_talk » Beiträge: 204 » Talkpoints: 0,15 » Auszeichnung für 100 Beiträge



Danke, ich hatte erst ein %d stehen^^

Code: Alles auswählen
switch(n) {
                     case (1): {
                          printf("\n\tWas wollen sie anhaengen?");
                          scanf("%d",&m);
                          append(&list,m);
                          break;
                          }
                     case (2): {
                          printf("\n\tWelches Element wollen sie loeschen?");
                          scanf("%d",&m);
                          remove_n(&list,m);
                          break;
                          }
                     case (3): {
                         printf("\n\tListe:\n\n");
                         printlist(list);
                         system("Pause");
                         break;
                         }
                     case (4) : {
                          printf("Nicht implementiert.");
                          system("Pause");
                          break;
                          }
                     case (5) : {
                          printf("Nicht implementiert.");
                          system("Pause");
                          break;
                          }
                     case (0) : {
                          break;
                          }
                     default : {
                          printf("Ungueltige Eingabe.");
                          system("Pause");
                          break;
                          }     
           }


So. Wenn ich jetzt eine Zahl ungleich 0-5 eingebe, geht es in den default-case und fragt erneut einen wert ab. Wenn ich allerdings einen Buchstaben eingebe, gibt er "ungültige Eingabe" aus und das Programm bleibt bei system("Pause") hängen.

Wenn ich die pause weglasse, gibt es eine Endlosschleife. Weiß einer woran's liegt?

» weeska » Beiträge: 85 » Talkpoints: 1,36 »


Klar dass es nicht geht. Du kiest mit der Scanf Funktion alle Eingaben als int ein. Wenn Du also einen Buchstaben eingibst, dann kommt da natürlich Mist raus. Ich würde das so machen, dass man die Eingabe als char einliest und dann in der Switch-Case Anweisung auch mit char vergleicht. Außerdem in der While Schleife eine andere Bedingung nehmen. Z.B. eine bool Variable, die man dann auf false setzt, wenn man aus der While-Schleife rausspringen will.
Hier der Code:

void input_routine() {
char n;
bool loop = true;
int m;
while (loop) {
system("cls");
printf("\t\t Was wollen Sie tun?\n\n");
printf("\tEin Element an die Liste haengen.\t(1)\n");
printf("\tEin Element aus der Liste loeschen.\t(2)\n");
printf("\tDie Liste ausgeben.\t\t\t(3)\n");
printf("\tDie Liste abspeichern.\t\t\t(4)\n");
printf("\tEine Liste laden.\t\t\t(5)\n");
printf("\tBeenden.\t\t\t\t(0)\n");
scanf("%c",&n);
switch(n) {
case ('1'): {
printf("\n\tWas wollen sie anhaengen?");
scanf("%d",&m);
append(&list,m);
break;
}
case ('2'): {
printf("\n\tWelches Element wollen sie loeschen?");
scanf("%d",&m);
remove_n(&list,m);
break;
}
case ('3'): {
printf("\n\tListe:\n\n");
printlist(list);
break;
}
case ('4') : {
printf("Nicht implementiert.");
break;
}
case ('5') : {
printf("Nicht implementiert.");
break;
}
case ('0') : {
loop = false;
break;
}
default : {
printf("Ungueltige Eingabe.");
break;
}
}
system("PAUSE");
}
}

So müsste er auch nicht mehr in einer Endlosschleife hängen. system("PAUSE"); kann man auch wegtun.

» Killyouridols » Beiträge: 517 » Talkpoints: 35,37 » Auszeichnung für 500 Beiträge


In C gibts keine Booleans. Wenn es die Buchstaben als ints einliest, müsste es doch bei allem ausser den 0-5 in den default-case springen, nur frag ich mich, warum er das nicht macht.

» weeska » Beiträge: 85 » Talkpoints: 1,36 »



Ich weiss ja nicht was scanf der Variable n zuweist, wenn statt einer Zahl ein Buchstabe eingegeben wird. Aber an dieser Stelle ist auf jeden Fall der Fehler. Am besten sollte man hier Fehlerüberprüfung machen und bei einem Fehler einfach einen Wert n zuweisen:

int check = scanf("%c",&n);
if(check != 1)
n = 10;

» Killyouridols » Beiträge: 517 » Talkpoints: 35,37 » Auszeichnung für 500 Beiträge


Ähnliche Themen

Weitere interessante Themen

^