读书人

c语言的死循环有关问题

发布时间: 2012-03-16 16:34:56 作者: rapoo

c语言的死循环问题
下面程序不加缓存清除函数 fflush(stdin);则是死循环,为什么?怎么修改?请教
#include "stdio.h"
main()
{
int n,a,b;
n=scanf("%d%d",&a,&b);
while(n!=2)
{
printf("error!input again:\n");
n=scanf("%d%d",&a,&b);
}
printf("%d%d",a,b);
}

[解决办法]
scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。
如:   scanf("%d%d", &a, &b);  
如果a和b都被成功读入,那么scanf的返回值就是2  
如果只有a被成功读入,返回值为1  
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。   
且返回值为int型.

[解决办法]
fflush(stdin);是为了清空一下缓存区的东西,否则scanf会去读取缓冲区中的东西,造成死循环
[解决办法]

C/C++ code
#include <stdio.h>void main() {    int n,a,b;    char c;    while (1) {        printf("\nInput two number(for example:1 2):");        fflush(stdout);        rewind(stdin);        n=scanf("%d%d%c",&a,&b,&c);        if (EOF==n) return;        if (3==n && '\n'==c) break;    }    printf("%d %d\n",a,b);}Input two number(for example:1 2):1,2Input two number(for example:1 2):a,bInput two number(for example:1 2):123aInput two number(for example:1 2):1 2cInput two number(for example:1 2):1 21 2
[解决办法]
比如输入 1 a然后回车,则缓冲区有下面字符:【1, a ,回车】

n=scanf("%d%d",&a,&b);
变量a读到1,缓冲区有 【a, 回车】
变量b读到a,不符合%d的规则所有语句返回则n=1,此时缓冲区还是 【a, 回车】

由于n=1进去循环,打印了出错语句,又到了n=scanf("%d%d",&a,&b);
缓冲区有数据,并且第一个数据a不是空格回车等%d可以忽略的,所以scanf直接返回0,则n=0,死循环


读书人网 >C语言

热点推荐