2016-11-11 1 views
-5
#include <stdio.h> 

void clearKeyboard(void){ 

    while(getchar()!='\n'); 
} 

void pause(void){ 

    printf("Press <ENTER> to continue..."); 
    clearKeyboard(); 
} 


int getMenuChoice(void){ 

    int choice; 
    printf("1- List all items\n"); 
    printf("2- Search by SKU\n"); 
    printf("0- Exit program\n> "); 

    scanf("%d", &choice); 

    return choice; 
} 

int getYesOrNo(void){ 

    char ch; 
    int ret; 
    ch = 0; 
    ret = 0; 

    while(ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n') 
    { 
      scanf("%c", &ch); 
      clearKeyboard(); 
      if (ch == 'Y' || ch == 'y'){ 
        ret = 1; 
        return ret; 
      } 
      if (ch == 'N' || ch == 'n'){ 
        ret = 0; 
        return ret; 
      } 
      else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n'){ 
        printf("Only (Y)es or (N)o are acceptable: "); 
      } 
    } 
    return ret; 
} 

int main(void){ 

    int choice; 
    int temp = 0; 
    choice = 0; 

    printf("=== TEST MENU ===\n"); 
    pause(); 
    while(temp == 0){ 
      choice = getMenuChoice(); 
      if (choice != 0){ 
        printf("*** not implemented ***\n"); 
      } 
      else{ 
        printf("Do you really want to quit? "); 
        temp = getYesOrNo(); 
      } 
    } 
    printf("=== END OF MENU TEST ===\n"); 

    return 0; 

} 

Wenn der Code ausgeführt wird, sollte es das Testmenü ausdrucken und ich müsste drücken Sie die EingabetasteFür if-Anweisung, obwohl es wahr ist, ist es Schleifen wieder

dann fortzusetzen, Es würde Vielfache von Druckanweisungen anzeigen (listall..search von ... exit)

So, wenn der Benutzer 0 eingibt, fragt es Sie möchten wirklich beenden und wenn der Benutzer y eingibt, sollte es Beenden Sie

Allerdings ist das Problem, das Programm fragt den Benutzer nicht notwendig Frage: „Nur (Y) n oder (N) o akzeptabel sind“ ein weiteres Mal, nachdem er fragt: „Sie wirklich beenden Sie wollen?“ wenn ich schon y eingegeben habe, ist das eine gültige antwort.

Warum ist das?

P. S-Bibliothek gibt es bestehende

+1

formatieren Sie bitte den Code richtig. Und wähle eine Sprache. Sieht aus wie C zu mir, aber wenn yuo es mit einem C++ Compiler kompiliert, dann würde ich es nennen – user463035818

+1

'char ch C++;' - ch deklariert, aber nicht initialisiert. Unmittelbar danach wird "ch" mit verglichen. Dies ist ein nicht definiertes Verhalten und ein Fehler. Diese –

+4

'(ch! = 'Y' || ch! = 'Y' || ch! = 'N' || ch! = 'N')' nie falsch sein, egal welcher Wert 'ch' trägt. So kann es durch 'while (1)' ersetzt werden. – alk

Antwort

2

Scanf ("% immer wahr d ", & Wahl); nur die Ziffer Zeichen verbraucht (auch Abstürze auf einem anderen Eingang, iirc), aber nicht die \ r \ l oder \ n Zeichen, die während der getYesOrNo Funktion verbraucht wird, wenn ich richtig bin (jemand bitte korrigieren Sie mich). Deshalb sollte das Programm die (y) es/(n) o Erinnerung direkt nach der Frage anzeigen, ob Sie wirklich aufhören möchten.

, das auch der Grund, warum das Hinzufügen der clearKeyboard Funktion macht es wie vorgesehen.

1

Es gibt einige andere Probleme mit diesem Code (zum Beispiel der UB in einem Kommentar erwähnt). Dies ist jedoch

 if (ch == 'Y' || ch == 'y'){ 
       ret = 1; 
       return ret; 
     } 
     if (ch == 'N' || ch == 'n'){ 
       ret = 0; 
       return ret; 
     } 
     else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n'){ 
       printf("Only (Y)es or (N)o are acceptable: "); 
     } 

ist wahrscheinlich nicht das, was Sie wollen. Die erste if ist unabhängig von den if - else, die danach kommen, also auch dann, wenn die erste Bedingung erfüllt ist, wird der Block danach ausgewertet. Wahrscheinlich wollen Sie diese stattdessen:

 if (ch == 'Y' || ch == 'y'){ 
       ret = 1; 
       return ret; 
     } 
     else if (ch == 'N' || ch == 'n'){ 
       ret = 0; 
       return ret; 
     } 
     else { 
       printf("Only (Y)es or (N)o are acceptable: "); 
     } 

Die Bedingung ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n' war nicht wirklich aussagekräftig, da der Charakter immer entweder nicht Y oder nicht N, so war es immer wahr.

0

Sie ein Leerzeichen vor %c hinzufügen sollten '\n' jeder führenden whitespaces.In Ihr Fall automatisch überspringen immer in ch gespeichert ist, weshalb else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n')


scanf(" %c", &ch); //This is the modified statement

Verwandte Themen