0
#include <stdio.h>
void main()
{
char ans='n';
 do
 {
     printf("\n Enter yes or no:");
     scanf("%c",ans);
     printf("\n entered %c",ans);
 }while(ans == 'y');
}

As do while the loop is getting exccuted and that scanf is working and prnting my answer (say my answer is y) , its coming for 2nd time but not doing the scan and getting exited . May i know the reason for this ? why it is happening and what is the correct way to handle the infinite loop.

4

3 に答える 3

3

&まず、scanf にa がありません。

scanf("%c", &ans);
            ^

次に、改行を処理していないため、%c書式指定子は空白を無視しません。つまり、文字を読み、リターンを押すと、次scanfはすぐにそれで満足し\nます。scanftryで空白を無視するには:

scanf(" %c", &ans);
       ^
于 2013-03-05T08:52:03.013 に答える
1

Not only are you missing the &address-of operator as indicated in other answers, but you're also missing the return value checks. Consider if a user presses CTRL+Z in Windows, or CTRL+d in Linux, to close stdin. Your loop would run infinitely and freeze your app ;)

if (scanf("%c", &ans) != 1) {
    break;
}

Alternatively, I would suggest using getchar because it's far cleaner:

int main(void) { /* NOTE: There is no "void main()" entrance point in C. main should always return 'int'. */
    int c;
    do {
        c = getchar();
    } while (c == 'y');
    return 0;
}
于 2013-03-05T08:58:22.343 に答える
-1

これらのリターン フィードをフラッシュするには、fflush(stdin)を使用します。

しかし、単一の文字を入力するときは、なぜgetchar()を使用しないのでしょうか?


編集: cnicutar here で正しく指摘されているように、 fflush(stdin) には未定義の動作があります。それを処理する組み込み関数はないように思われるため、コード自体で処理する必要があります。

一例は次のとおりです。

    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF);

それを指摘してくれてありがとう!

于 2013-03-05T08:56:24.490 に答える