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');
}

就像循环正在执行并且 scanf 正在工作并打印我的答案(比如说我的答案是 y)一样,它第二次出现但没有进行扫描并退出。我可以知道这是什么原因吗?为什么会发生这种情况以及处理无限循环的正确方法是什么。

4

3 回答 3

3

首先,您&在 scanf 中缺少 a:

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

其次,您没有处理换行符,%c格式说明符不会忽略空格。所以你读了一个字符,按回车,下一个scanf立刻就满足了\n。在scanf尝试中忽略空格:

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

您不仅缺少&address-of其他答案中指示的运算符,而且还缺少返回值检查。考虑用户是否在 Windows 中按 CTRL+Z 或在 Linux 中按 CTRL+d 来关闭标准输入。您的循环将无限运行并冻结您的应用程序;)

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

或者,我建议使用它,getchar因为它更清洁:

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 正确指出的那样, fflush(stdin) 具有未定义的行为。似乎没有任何内置函数可以解决这个问题,因此必须在代码本身中加以处理。

一个例子可能是:

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

感谢您指出这一点!

于 2013-03-05T08:56:24.490 回答