MCC asked in 電腦與網際網路程式設計 · 2 decades ago

C語言while & switch

再請問大家

程式為反覆詢問輸入值,輸入A顯示1,輸入Z顯示10

直到輸入Q顯示10並離開

#include <stdio.h>

int main (void)

{char letter;

do{printf("Enter a letter.\n");

scanf("%c", &letter);

switch (letter)

{case 'A':

printf("The number is 1.\n");

break;

case 'Q':

case 'Z':

printf("The number is 10.\n");

break;

default:

printf("Plz enter again.\n");

break;}

}while(letter!='Q');

printf("EXIT!!\n");

return 0; }

不過顯示時卻出現滿奇怪的問題

Enter a letter.

A

The number is 1.

Enter a letter.

Plz enter again.

Enter a letter.

也就是說所有輸出都正確(包括A, Z, S),卻多了這2行

(除了Q,他直接顯示10,EXIT)

Enter a letter.

Plz enter again.

為什麼會這樣ㄋ?

3 Answers

Rating
  • Lv 7
    2 decades ago
    Favorite Answer

    原因是因為scanf裡有一個buffer. 當你輸入a時你打進'a'和'\n'. scanf就把你輸入的存入buffer裡. 因你只要一個char, 所以scanf給你'a'而把'\n'留在buffer裡. 下一次你再用scanf時, scanf看到它還有一個'\n'在buffer裡. 所以scanf把'\n'給你. 如果你把scanf("%c", letter);改成scanf("%c%c", letter, tmp);就可以了. 因letter會是你打進的字母. tmp會是'\n'.

    #include <stdio.h>

    int main (void)

    {

    char letter, tmp;

    do{

    printf("Enter a letter.\n");

    scanf("%c%c", &letter, &tmp);

    switch (letter)

    {

    case 'A':

    printf("The number is 1.\n");

    break;

    case 'Q':

    case 'Z':

    printf("The number is 10.\n");

    break;

    default:

    printf("Plz enter again.\n");

    break;

    }

    } while(letter!='Q');

    printf("EXIT!!\n");

    return 0;

    }

    或你可以在switch之後清除scanf裡的buffer也可以

    #include <stdio.h>

    int main (void)

    {

    char letter;

    do{

    printf("Enter a letter.\n");

    scanf("%c", &letter);

    switch (letter)

    {

    case 'A':

    printf("The number is 1.\n");

    break;

    case 'Q':

    case 'Z':

    printf("The number is 10.\n");

    break;

    default:

    printf("Plz enter again.\n");

    break;

    }

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

    } while(letter!='Q');

    printf("EXIT!!\n");

    return 0;

    }

    不知這樣講你懂不懂, 不懂請再問

  • 1 decade ago

    ..

    可不可以前面外加空白 看的頭很痛

  • 2 decades ago

    你的問題在於你的do迴圈跑了兩次,而第二次並沒有執行scanf那一行。

    修正了一下~用continue萊跳出enter的問題~可以維持只使用一個變數~

    #include <stdio.h>

    #include <string.h>

    #include <iostream>

    int main (void)

    {

    char letter;

    printf("Enter a letter.\n");

    while (getchar(letter)==1&&letter!='Q')

    {

    switch (letter)

    {

    case 'A':

    printf("The number is 1.\n");

    break;

    case 'Z':

    printf("The number is 10.\n");

    break;

    default:

    printf("Plz enter again.\n");

    break;

    }

    printf("Enter a letter.\n");

    }

    printf("EXIT!!\n");

    return 0;

    }

    你可以在你程式碼的第五行後面加一行 printf("%c\n",letter);

    萊檢查多跑的那圈迴圈,她的letter值是多少。

Still have questions? Get your answers by asking now.