扫描变量并在do while循环中使用它

时间:2013-03-05 08:49:51

标签: c do-while

#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)时,它会第二次来,但不会进行扫描并退出。我可以知道这个的原因吗?为什么会发生这种情况以及处理无限循环的正确方法是什么。

3 个答案:

答案 0 :(得分:3)

首先,你在scanf中错过了&

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

使用 fflush(stdin)刷新这些返回Feed。

但是当您输入单个字符时,为什么不使用 getchar()


编辑: 正如cnicutar在这里正确指出的那样,fflush(stdin)具有未定义的行为。似乎没有任何内置函数来处理它,因此必须在代码本身中处理。

一个例子可能是:

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

感谢您指出那里!