[C] Doppeltes Menu nach Eingabe

Razorhawk

Webdesigner und MSP
Also ich hab hier einen Code.
Das Problem ist einfach beschrieben.
Nach der ersten Eingabe wird das Menu 2 mal dargestellt.
Mir erscheint es als wenn er das "Enter" 2 mal hintereinander im Speicher hat und für den nächsten Schleifendurchlauf wiederverwendet.
Ich glaube ich müsste den Eingabepuffer leeren bevor die Schleife zuende ist.
Wenn ich richtig liege, wie mach ich das am besten?

Code:
#include <stdio.h>
#include <stdlib.h>

const adressen = 100, astring = 26;





int main(int argc, char *argv[])
{
    char option;
    
    struct str_adress {char prename[astring];
               char name[astring];
               char telnr[astring];
              } adress;
    
    while( option != "q"){
    
        printf(" N : Suchen nach Nachname \n V : Suchen nach Vorname \n T: Suchen nach Telefonnummer \n Q : Programmabbruch \n");
        printf("\n Wählen Sie eine Option: ");
        scanf("%c",&option);
        if (option != 'n' && option != 'v' && option != 't' && option != 'q' && 
        option != 'N' && option != 'V' && option != 'T' && option != 'Q'){ printf("\n unzulaessige Eingabe fuer Optionen!\n\n");}
               
    
    }
    

  
  
    system("PAUSE");	
    return 0;
}
 
Hi.

Code:
    char option;
    
    while( option != "q"){
Hier vergleichst du ein Zeichen mit einem String. Das geht so nicht und dein Compiler sollte dich auch davor warnen. Strings mußt du mit Hilfs-Funktionen wie strcmp bzw. strncasecmp etc. vergleichen. Zeichen kannst du auch mit dem == bzw. != Operator vergleichen.

Dein Problem mit dem Menu ist, das du jeweils nur ein Zeichen einliest. Was du allerdings eingibts ist ein Buchstabe und dann noch das Zeichen für das Zeilenende. D.h. wenn du "v ENTER" drückst liest er erstmal das v ein und beim 2ten Durchlauf gleich das Enter.

Du kannst ganz einfach alle Whitespace Zeichen in der Eingabe überlesen bevor du dein Zeichen in die Variable speicherst indem du ein Leerzeichen an den Anfang des Formatstrings von scanf einfügst.

Dann solltest du davon absehen Typen von Variablen implizit als int zu deklarieren.

Außerdem solltest du kontrollieren, ob überhaupt ein Zeichen eingelesen werden konnte. Und entweder initialisierst du die Variable q oder du baust deine while-Schleife in eine do-while-Schleife um:
Code:
#include <stdio.h>
#include <stdlib.h>

const int adressen = 100, astring = 26;

int main(int argc, char *argv[])
{
  char option;
    
  struct str_adress {char prename[astring];
    char name[astring];
    char telnr[astring];
  } adress;
  
  do {
    
    printf(" N : Suchen nach Nachname \n"
           " V : Suchen nach Vorname \n"
           " T: Suchen nach Telefonnummer \n"
           " Q : Programmabbruch \n");
    printf("\n Wählen Sie eine Option: ");
    if (scanf(" %c",&option) == 1) {
      if (option != 'n' && option != 'v' && option != 't' && option != 'q' && 
          option != 'N' && option != 'V' && option != 'T' && option != 'Q'){ printf("\n unzulaessige Eingabe fuer Optionen!\n\n");
      }
    } else break;
  } while( option != 'q');
  
  system("PAUSE");	
  return 0;
}
 
Okay, aber warum solllte es passieren, dass kein Zeichen eingelesen werden konnte?

Ich gebe ein Zeichen ein und drücke Enter. Es wird doch in jedem Fall etwas eingegeben.
 
Ein grosser Mentor sagte: "Das Unerwartete passiert zwar selten aber es PASSIERT!",
Ist schon lange her, dass ich mich mit der Konsole rumgeschlagen hab, aber wenn ich mich recht erinnere, war es ein Problem eine Zahl einzulesen, wenn Buchstaben eingegeben wurden.
Gruss Michael
 
Razorhawk hat gesagt.:
Okay, aber warum solllte es passieren, dass kein Zeichen eingelesen werden konnte?

Ich gebe ein Zeichen ein und drücke Enter. Es wird doch in jedem Fall etwas eingegeben.
Woher willst du das wissen? Eine Eingabe kann generell immer scheitern - selbst die Eingabe von nur einem Zeichen. Normalerweise kann man eben nicht annehmen das alles reibungslos funktioniert. Irgendwie könnte der Standardeingabe Stream evtl. in einen Fehlerzustand gehen oder bereits in einem Fehlerzustand sein. Oder die Eingabe ist einfach schon zu Ende (wenn das Programm z.B. Teil einer Pipe ist).

Du solltest einfach immer den Status der Eingabe prüfen denn man kann ja schließlich nicht an alle Möglichkeiten denken wenn, ob und wie da was schief gehen kann.
 
Gut da hab ich meine Frage in jeder Hinsicht beantwortet bekommen.
Mir war schon irgendwie klar, dass man das abfangen sollte, aber ich wollte auch tiefliegendere Gründe haben, damit es einen Sinn macht, denn ich mache ungern etwas ohne zu wissen warum.
 
Zurück