2013-03-05 23 views
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'); 
} 

因为这样做而循环是越来越exccuted和scanf函数是工作,prnting我的回答(说我的回答为Y),其未来的第2次,但没有做的扫描并退出。我可以知道这个的原因吗?为什么会发生,以及处理无限循环的正确方法是什么。扫描变量,并用它在do while循环

回答

3

先上去,你错过了在scanf函数一个&

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

其次,你不处理换行符和%c格式说明不忽略空白。所以你读了一个字符,然后按回车键,然后scanf立即被\n满足。要忽略空白在scanf尝试:

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

感谢它的工作原理,所以只对strint和不需要的时候,我们扫描所有其他人需要的。 – 2013-03-05 09:18:53

-1

使用fflush(标准输入)冲洗那些回报饲料。

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


编辑: 作为正确地指出由cnicutar这里,fflush(标准输入)已未定义行为。似乎没有任何内置功能来处理这个问题,因此必须在代码本身中予以照顾。

一个例子是:

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

感谢您指出了在那里!

+0

'getchar'确实是一个很好的建议,但[fflush(stdin)'未定义](http://c-faq.com/stdio/stdinflush.html),你不应该推荐它。 – cnicutar 2013-03-05 08:56:58

+0

**请勿使用fflush(stdin)**。 fflush仅限用于打开输出的文件。 stdin打开输入,但不输出。因此,fflush(stdin)是未定义的行为。 – Sebivor 2013-03-05 09:00:05

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