2015-10-11 83 views
0

我試圖做一個有條件的和的if-else這個問題但是我的主要功能是不執行的我本來打算順序步驟循環 。如何讓我的「主」功能以正確的順序執行?

#include<stdio.h> 
    void draft(int, char); 
    void main() 
    { 
     int age = 0; 
     char sex; 
     printf("How old are you?"); 
     scanf_s("%d", &age); 
     printf("Please enter your sex.(M or F)"); 
     scanf_s("%c", &sex); 
     draft(age,sex); 
     system("pause"); 
     return; 
    } 
    void draft(int age,char sex) 
    { 
     if (age>= 21 && sex=="M") 
     { 
      printf("Congratulations son, You will be going off to Syria to fight for your country.\n"); 
     } 
     else if (age >= 18 && sex == "M") 
     { 
      printf("Congratulations son, You will be going off to Vietnam to fight for your country.\n"); 
     } 
     else if (age < 18 && sex == "M") 
     { 
      printf("Sorry Son you're still too young.\n"); 
     } 
     else if (age >= 21 && sex == "F") 
     { 
      printf("Sorry,miss, only men can serve.\n"); 
     } 
     else if (age >= 18 && sex == "F") 
     { 
      printf("Sorry,little lady, only men can serve.\n"); 
     } 
     else if (age < 18 && sex == "F") 
     { 
      printf("Sorry,little girl, only men can serve.\n"); 
     } 
     else 
     { 
      printf("Please enter age and sex."); 
     } 
     return; 
    } 

將提示用戶輸入他的年齡,但進入正題後,將直接進入「徵求意見稿」函數的最後一個ELSE語句不給用戶輸入性的機會。

+1

我不明白基於這裏的代碼會發生什麼。在調試器中逐行執行。 –

+0

@EricJ .:我猜你沒有看到'scanf_s(「%c」,&sex);'? – EOF

+0

如果你只是使用'scanf'會怎麼樣? –

回答

1

的問題是,你正在使用scanf函數從標準輸入解析輸入。然而,這只是將它視爲流。如果您在第一個輸入處輸入類似32F的內容,則您的程序實際上可以正常工作。

[編輯爲清楚:你的程序實際上沒有跳奇怪的是,正在發生的事情是,第二scanf函數從標準輸入數據時未用的第一個讀立即返回。在這種情況下,它是用戶按下Enter鍵時的返回字符。所以它會立即返回一個不是'M'或'F'的值,因此它會運行最後的else。不存在「失靈」發生]

注:有一個在你的draft()功能的第二個問題。您可以使用"M""F"這是字符串(字符數組),而你真正需要使用'M''F'這是單個字符。

你想要什麼是讀取一行,並在同一時間解析它。所以我建議進行以下更改。我用fgets替換了scanfs,它將讀取一行。然後使用sscanf解析該行。

#include<stdio.h> 

void draft(int, char); 
int main() 
{ 
    int age = 0; 
    char sex; 
    char line[100] = {0}; 

    printf("How old are you?"); 
    fgets(line, sizeof(line), stdin); 
    sscanf(line, "%d", &age); 
    printf("Please enter your sex.(M or F)"); 
    fgets(line, sizeof(line), stdin); 
    sscanf(line, "%c", &sex); 
    draft(age,sex); 

    return 0; 
} 
void draft(int age,char sex) 
{ 
    if (age>= 21 && sex=='M') 
    { 
     printf("Congratulations son, You will be going off to Syria to fight for your country.\n"); 
    } 
    else if (age >= 18 && sex == 'M') 
    { 
     printf("Congratulations son, You will be going off to Vietnam to fight for your country.\n"); 
    } 
    else if (age < 18 && sex == 'M') 
    { 
     printf("Sorry Son you're still too young.\n"); 
    } 
    else if (age >= 21 && sex == 'F') 
    { 
     printf("Sorry,miss, only men can serve.\n"); 
    } 
    else if (age >= 18 && sex == 'F') 
    { 
     printf("Sorry,little lady, only men can serve.\n"); 
    } 
    else if (age < 18 && sex == 'F') 
    { 
     printf("Sorry,little girl, only men can serve.\n"); 
    } 
    else 
    { 
     printf("Please enter age and sex."); 
    } 
    return; 
} 
+1

不,甚至不用'gets )'',因爲很好的原因,我們不推薦使用它,而且,如果你使用'draft()',你應該發佈必要的修改。 – EOF

+1

@EOF:'gets'不僅僅是棄用的;截至2011 ISO C標準它已經完全從語言中刪除了,我同意:甚至不建議使用'gets'。 –

+0

我編輯過它使用'fgets'。我只是使用'gets'作爲最簡單的事情來獲取它 – waterjuice

1

兩個問題:

第一個電話scanf_s後,換行留在緩衝區中。該換行立即被第二個scanf_s拾取。您需要通過在%d%c之間放置空格來更改模式以匹配並丟棄任何換行符。此外,你應該檢查返回值,以確保匹配模式的值改爲:

printf("How old are you?"); 
if (scanf_s(" %d", &age) != 1) { 
    printf("You must enter a value age.\n"); 
    exit(1); 
} 
printf("Please enter your sex.(M or F)"); 
if (scanf_s(" %c", &sex) != 1) { 
    printf("You must enter a value age.\n"); 
    exit(1); 
} 

draft,你使用雙引號代替單引號字符文字:

if (age>= 21 && sex=="M") 

這裏,"M"是一個字符串,包含一個字符加上一個NULL終止符。你想要的是'M',這是M.因此改變上述行的字符:

if (age>= 21 && sex=='M') 

並作出了類似的修復,以其他五個線,同樣的問題。

0

嗯,這是一個問題:

scanf_s("%c", &sex); 

與轉換說明像%s%d,在%c符不會引起scanf(和,我假設,scanf_s)跳過任何前導空格中輸入流。所以它會在你第一次輸入之後馬上拿起換行符,因此它不會等你進入性行爲。

爲了解決這個問題,將空白空間的轉換說明符之前:

scanf_s(" %c", &sex); 

的另一個問題是你比較sex == "M"sex == "F"; sex是單個char,但是"M""F"是字符字符串。使用比較sex == 'M'sex == 'F'(單引號,而不是雙引號)。