Problem mit Menü: Menüpunkte werden mehrfach ausgeführt
-
char c; ..... while(c=='\n'); // Wenn c an dieser stelle gleich '\n' ist, ist das eine Endlosschleife. Wenn ungleich sinnlos. Beachte das ; am Ende scanf("%s",&c); // Du sagst scanf "lies einen String ein", übergibst aber die Adresse auf EIN char
Vielleicht ist es einfacher zum beenden die 0 zu benutzen. Dann kannst du einfach ein int einlesen.
Nimm aber mal die Forensuche zum Thema scanf und fgets und '\n'.
-
Vor allem ist es scanf("%c",&c); und nicht %s
-
Dann hat er doch wieder das gleiche Problem.
-
Hallo, danke erstmal für die Antworten, habs schon fast geschafft. Allerdings bräuchte ich eine switch-Anweisung, die 2 Argumente "switched", also quasi sowas:
switch(c[0],c[1]) { case '1','0': printf("eins\n"); MenueAusgabe(); break;
Gibt es sowas? Immerhin meckert der Compiler bei switch(a,b) nicht, kann man so eine switch Anweisung bauen? (Find bei google nix zu dem Thema)
-
Nein, geht nicht. Switch kann nur eine Expression entgegen nehmen.
Du hast aber einmal die Möglichkeit einer Verschachtelung
switch(c[0]) { case '1': { switch(c[1]) { case '0': { } break; } } break; }
Oder aber in deinem Fall könnte man meinen, dein Menu hat mehr als 10 Punkte. Dann wäre die Arbeit mit int möglich:
int c; scanf("%d", &c); switch(c) { case 10: { } break; }
Oder aber eine eingegebene Zeichenkette mittels atoi in einen int wandeln.
Wenn sowas selten vorkommt, kann man auch auf ein if zurückgreifen.
Edit: break's ergänzt, bevor wieder jemand an die Decke springt.
-
Hm, das ist ja ziemlich blöd dass switch nur einen Parameter übernehmen kann...
Habs jetzt mal so versucht, hat aber immernoch 2 Probleme. Erstmal hier der Quellcode:
#include<stdio.h> #include<stdlib.h> #define MAX 10 void MenueAusgabe(void); void main(void) { char c[MAX-1]={0}; int i=0; MenueAusgabe(); while(c[1]==0 && c[0]!='e' && c[0]!='E') { do { gets(c); }while(c=='\n'); printf("%d\n",c[0]); printf("%d\n",c[1]); //for(i=0;i<=MAX;i++) // printf("%d\n",c[i]); switch(c[0]) { case '1': if(c[1]==0) { printf("eins\n"); MenueAusgabe(); break; } case '2': if(c[1]==0) { printf("zwei\n"); MenueAusgabe(); break; } case '3': if(c[1]==0) { printf("drei\n"); MenueAusgabe(); break; } case '4': if(c[1]==0) { printf("vier\n"); MenueAusgabe(); break; } case '5': if(c[1]==0) { printf("fuenf\n"); MenueAusgabe(); break; } default: if(c[0]!='e'&& c[0]!='E') { printf("Fehlerhafte Eingabe\n"); MenueAusgabe(); } break; } if(c[0]!='e'&& c[0]!='E') { for(i=0;i<=MAX-1;i++) c[i]=0; } } } void MenueAusgabe(void) { printf("--------------------------------------------------------------------------------"); printf("Bitte waehlen Sie einen Menuepunkt\n\n"); printf("(1) Neuen Wert einlesen\t\t(2) Naechsten Wert anzeigen\n"); printf("(3) Wert korrigieren\t\t(4) Werte ausgeben\n"); printf("(5) Liste entfernen\t\t(E) Exit\n"); printf("--------------------------------------------------------------------------------\n"); }
1.Problem: Wenn ich z.B. e1 eingebe beendet das Programm auch, obwohl es dann "Fehlerhafte Eingabe" ausgeben sollte.
2.Problem: Wenn ich mehr Zeichen eingebe als das Array MAX lang ist, stürzt C komplett ab.
Wie könnte ich diese Probleme beheben? Ich will einfach dass wirklich NUR die Zahlen 1-5 und das Zeichen e eingegeben werden kann, bei ALLEN anderen Zeichen soll "Fehlerhafte Eingabe" ausgegeben werden, also auch wenn ich 1111111111111111111111111111111111111111111111111111111 eingebe. Natürlich könnte ich mein Array einfach 1000 Einträge lang machen, aber es muss doch auch eleganter gehen, oder?
-
Du dokterst irgendwie an der falschen Stelle rum
Der zweite und dritte Hinweis von BasicMan01 wird dir mehr bringen.
Lies einen string ein.
Wandele ihn mit strtol in einen int.
Wenn es ein e oder E ist mach eine 0 draus (oder irgendeine andere Zahl.
Mit dem int gehst du in das switch.So wie du es gerade machst ist doch alles fehlerhaft, was bei c[1] != 0 ist.
Nach 9 Menüpunkten ist bei dir Schluß.
-
Hm also wenn ich atoi benutze und beispielsweise 1w eingebe macht mir atoi 1 draus. Folglich würde mein Switch auch 1 übernehmen, soll es aber nicht.
-
Darum nimmt man ja auch strtol.
Mit dem 2. Parameter **char endptr kann man die Stelle bekommen, die zum Abruch der Wandlung führte.
-
eey schrieb:
Ich will einfach dass wirklich NUR die Zahlen 1-5 und das Zeichen e eingegeben werden kann, bei ALLEN anderen Zeichen soll "Fehlerhafte Eingabe" ausgegeben werden, also auch wenn ich 1111111111111111111111111111111111111111111111111111111 eingebe. Natürlich könnte ich mein Array einfach 1000 Einträge lang machen, aber es muss doch auch eleganter gehen, oder?
Zunächst erstmal ein Lob an dieser Stelle, du machst dir nämlich Gedanken über mögliche Fehleingaben der Anwender und die Behandlung derer, ca. 98% der Fragesteller in diesem Forum machen sich diese professionellen Gedanken nicht frei nach dem Motto "ich will nur mal schnell...", "hier mit meinem Compiler läuft es doch,...".
Für dein Problem wäre z.B. ohne irgendwelches Integerkonvertierungsgeraffel möglich:int c; c=getchar(); while( !feof(stdin) && getchar()!='\n' ); switch( c ) { case '1': ...
Das funktioniert z.B. für '0'...'9' und wenn das nicht reicht natürlich auch für weitere ASCII Zeichen 'a'...'z', 'A'...'Z' usw.
Die Gleichbehandlung von case-Zweigen geschieht mit:
switch( c ) { case '1': case '2': break; case '3': case '4': break;