- 论坛徽章:
- 0
|
原帖由 xiangfei108 于 2007-5-3 11:26 发表
不好意思,我还是不明白。scanf一次调用不成功之后,就不能再次调用了吗?
我现在的问题是,输入a以后,程序一直不停的输出。说明程序一直循环,但是不会再次执行scanf。
scanf语句执行时,首先从缓冲区中读入一个数据,如果和第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,如果其中有一个参数不匹配,那么就从这个地方跳出来,忽略当前这个scanf,而继续执行下一条语句.
我这儿有一个例子,也许能帮助你更了解.
- int main()
- {
- int a = 1, b = 2;
- char c = 'K';
- int i1, i2;
- i1 = scanf("%d%d\n", &a, &b);
- // fflush(stdin);
- i2 = scanf("%c", &c);
- printf("%d\n%d\n%c\n", a, b, c);
- printf("i1 = %d\ni2 = %d\n", i1, i2);
- return 0;
- }
复制代码
如果你输入12 a 然后回车.程序输出12 2 a 1 1后退出.因为第一个scanf由于读第二个参数的时候发现与要求的不相同,所以就会跳出, 那么返回1,即i1的值为1, 继续执行下一个scanf(),而刚刚的缓冲区中还存在a,所以说就不用从键盘再去读数据,而直接将刚刚的a的值赋给c,所以就直接打印出来.12 2 a. 而此时i2的值为2.
而如果你加上了一个fflush之后,就可以将刚刚的缓冲区里面的内容给清除掉.因此你这时候输入12 a之后还要再输入一个字符才可以使程序退出.因为将缓冲区清空之后那么第二个scanf就会一直在那儿等待你输入.
这也就是为什么你虽然没有输入但程序一直在运行的原因了. 因为缓冲区里面的数据仍然存在. 但是却读不进来! 所以一直在循环scanf()这个函数. |
|