2015-09-24 52 views
0

我已經看過以前在stackoverflow上提出的問題,但這是我第一次問,所以我提前道歉任何格式錯誤。我已經在C編程上花了大約一個月的時間,我已經給了一個任務,在我的主函數中使用do/while循環來循環一個displayMenu(),它允許用戶輸入1, 2或3顯示某個信息塊。C:我如何在代碼中打破這個循環?

int main(void) 
{ 
    int option = 0; 
    do 
    { 
     option = displayMenu(); 
    } 
    while (option == displayName() || displayColor() || displayFood()); 
} 

//Display the menu for choosing an option or exiting the program 
int displayMenu() 
{ 
    int choice = 1; 
    while (choice == 1 || 2 || 3) 
    { 
     puts("Choose which piece of information you would like to know:"); 
     printf("%s", "1 - My name, 2 - My favorite color, 3 - My favorite food\n"); 
     printf("%s", "Or type in any other number to exit the program: "); 
     scanf("%d", &choice); 
     puts(""); 

     if (choice == 1) 
      displayName(); 
     if (choice == 2) 
      displayColor(); 
     if (choice == 3) 
      displayFood(); 
    } 
    return choice; 
} 

現在,我確定這個錯誤是在這兩個方法中的某個地方,但爲了以防萬一,我發佈了顯示方法。

//Function to display my name 
int displayName() 
{ 
    int value = 1; 
    puts("My name is x.\n"); 
    return value; 
} 

//Function to display my favorite color 
int displayColor() 
{ 
    int value = 2; 
    puts("My favorite color is y.\n"); 
    return value; 
} 

//Function to display my favorite food 
int displayFood() 
{ 
    int value = 3; 
    puts("My favorite food is z.\n"); 
    return value; 
} 

如果用戶輸入1,2或3,程序會正確顯示信息並循環提示用戶再次輸入另一個值。但是,如果輸入任何其他號碼,則程序會再次提示用戶輸入值,而應該關閉程序。 我在做什麼錯?我試圖前三if語句後面插入

else return choice; 

,因爲我認爲這將需要打破循環,但沒有奏效。這與我的條件有關嗎?我不確定自己的條件是否正確,(關於==和||優先級和什麼),所以如果有人能夠澄清這點,它會很好。 我知道可能有更高效的方法來執行這個程序,但我僅限於我在課堂上教過的東西,這實際上不僅僅是我編寫的東西。

+2

爲什麼人們不檢查'scanf'的返回值?這是一個集體失憶症/ –

+0

@edrodriguez - 什麼是「maaag」? –

+0

@edrodriguez - 只是好奇你爲公平的性行爲輸入了什麼內容 –

回答

5
while (choice == 1 || 2 || 3) 

相當於

​​

這相當於

while (1) 

你想要的是:

while (choice == 1 || choice == 2 || choice == 3) 
+0

啊我明白了,謝謝!我需要再次審查和/或分配。我對我的代碼做了這個改變(我也改變了選項== displayName || displayColor等)。現在,如果我輸入除1,2或3之外的任何內容,則程序將結束,但在此之前它也會打印出所有三條信息。這是因爲我在這三種方法中返回一個值嗎? –

+0

同意此回答我做 –

+0

@KavianA這是因爲'while(option == displayName()/ * ... * /)'將在上次評估。您可能需要更改「do .. while」循環或在必要時立即從循環中斷開。 – ouah

2

這行是一個infite循環:

while (choice == 1 || 2 || 3) 

我想你想要的是:

while (choice == 1 || choice == 2 || choice == 3) 
1

忽略原代碼中的許多錯誤,你可以做些什麼來重構循環邏輯是使用函數指針數組:

int (*functions[])(void) = { displayName, displayColor, displayFood }; 

int choice = -1; 
do { 
    choice = get_choice(); // assuming get_choice returns an integer between 0 and 2, or -1 on error/eof. 
    if (choice != -1) 
     functions[choice](); 

} while (choice != -1) 

這將使您的代碼更加簡潔,只要您的所有函數具有相同的原型。

+0

我想這樣做,但像我一樣最後說:「我知道有更高效的方法來執行這個程序,但是我受限於我在課堂上教過的東西,這實際上不僅僅是我編寫的東西。」我不允許使用數組。 –

+1

對,我錯過了那部分。我想這個答案是爲了後代。 – Snaipe

+0

@KavianA如果您有興趣瞭解** Snaipe **所說的話,請看看這裏http://stackoverflow.com/questions/32614150/clarification-on-function-pointers-in-c/32615240#32615240 – Michi

0

那麼,因爲你有你的答案我不會試着給你另一個答案,這可能是相同的。

有一件事你應該知道,如果用戶鍵入一個字母多家+一個字母(1J)會發生什麼?

當你處理文本菜單時,你應該控制你的程序。

這裏是你的程序的一個更好的辦法:)

#include <stdio.h> 
#include <string.h> 

int checkInput(int min, int max){ 
    int option,check; 
    char c; 

    do{ 
     printf("Choose an Option:\t"); 

     if(scanf("%d%c",&option,&c) == 0 || c != '\n'){ 
      while((check = getchar()) != 0 && check != '\n'); 
      printf("\tThe option has to be between %d and %d\n\n",min,max); 
     }else if(option < min || option > max){ 
      printf("\tThe option has to be between %d and %d\n\n",min,max); 
     }else{ 
      break; 
     } 
    }while(1); 

    return option; 
} 

void quit(void){ 
    printf("Goodbye...\n"); 
} 
//Function to display my name 
int displayName(void){ 
    int value = 1; 
    puts("My name is x.\n"); 
    return value; 
} 

//Function to display my favorite color 
int displayColor(void){ 
    int value = 2; 
    puts("My favorite color is y.\n"); 
    return value; 
} 

//Function to display my favorite food 
int displayFood(void){ 
    int value = 3; 
    puts("My favorite food is z.\n"); 
    return value; 
} 

int displayMenu(void); 

int main(void){ 
    int option = 0; 
    do{ 
     option = displayMenu(); 
    } 
    while (option != 0); 
} 



//Display the menu for choosing an option or exiting the program 
int displayMenu(void){ 
    int choice; 

    do{ 
     puts("Choose which piece of information you would like to know:"); 
     printf("%s", "1 - My name\n2 - My favorite color\n3 - My favorite food\n\n"); 
     printf("%s", "Or type in any other number to exit the program: "); 

     choice = checkInput(0,3); 
     puts(""); 

     if (choice == 1){ 
      displayName(); 
     }else if (choice == 2){ 
      displayColor(); 
     }else if (choice == 3){ 
      displayFood(); 
     }else if(choice == 0){ 
      quit(); 
     } 

    }while (choice != 0); 

    return choice; 
} 

大概做{}而(;更好,而{012}是