当前位置: 代码迷 >> C语言 >> 奇怪的scanf,这个地方必须加循环才能输入??
  详细解决方案

奇怪的scanf,这个地方必须加循环才能输入??

热度:167   发布时间:2007-09-01 11:41:28.0
奇怪的scanf,这个地方必须加循环才能输入??

某书上的一道题,从键盘输入一个正整数,如过是7的倍数就输出到屏幕。要求不断输入与输出,
直到使用者选择退出。



#include <stdio.h>
#include <conio.h>
main()
{
int t=0;
char flag='\0';
do
{ printf("\nPlease input the num :");
scanf("%d",&t);
if (t%7==0)
printf("\nCannot be output!");

else
printf("\nthe number canbe output:%d",t);

printf("\nContinue?(Y/N)");
do{
scanf("%c",&flag);
}while(flag!='y'&&flag!='Y'&&flag!='n'&&flag!='N');

}while(flag=='y'||flag=='Y');
printf("Press any key to quit the window...");
getch();
}


现在这样写运行是正常的(win-tc)。
但把红色部分改为


do{printf("\nContinue?(Y/N)");
scanf("%c",&flag);
}while(flag!='y'&&flag!='Y'&&flag!='n'&&flag!='N');

这样就出现问题了:跳出两行 Continue?(Y/N) ,也就是printf("\nContinue?(Y/N)");运行了两次,为何????


红色部分再改一下,只写


printf("\nContinue?(Y/N)");
scanf("%c",&flag);

也就是不要检查字符是否为y、n的循环,运行到 Continue?(Y/N) 时就输入不了字符了,为什么???



搜索更多相关的解决方案: scanf  printf  output  include  

----------------解决方案--------------------------------------------------------
这你仔细看下do while{}的运行流程就知道了
----------------解决方案--------------------------------------------------------

并不是这样的.
找了很久终于找到了.
如:
#include<stdio.h>
main()
{
int t=0;
char flag='\0';
scanf("%c",&flag);
scanf("%c",&flag);
}
输入1<回车就会结束>;
原因在于第二个scanf("%c",&flag);
输入的是第一次输入的回车.


----------------解决方案--------------------------------------------------------
回复:(vbc)并不是这样的.找了很久终于找到了.如:#i...

谢谢!! 是这个问题,我在前面加了个getchar(); 就ok了,我提的两个问题都是由这个原因引起的。


#include <stdio.h>
#include <conio.h>
main()
{
int t=0;
char flag='\0';
do
{ printf("\nPlease input the num :");
scanf("%d",&t);
if (t%7==0)
printf("\nCannot be output!");

else
printf("\nthe number canbe output:%d",t);

getchar();
do{printf("\nContinue?(Y/N)");
scanf("%c",&flag);
}while(flag!='y'&&flag!='Y'&&flag!='n'&&flag!='N');

}while(flag=='y'||flag=='Y');
printf("\n\nPress any key to quit the window...");
getch();
}

好多书本上问什么就有两个 scanf连用,而且运行竟然不出问题的例子(比如连续两次简单的数字输入)???

我想起来了,以前我在论坛上好想问过类似问题,就想知道 输入 输出 缓冲 等等这些东东到底怎么回事。
盼望高手给个完整解答。


----------------解决方案--------------------------------------------------------

第一次输入数t时,如果输入字符怎么出现三次Continue?(Y/N)
为什么??


----------------解决方案--------------------------------------------------------

而且运行竟然不出问题的例子(比如连续两次简单的数字输入)???
只有连续两个字符才会有这种情况.
因为数字输入时它不将回车看成输入.


----------------解决方案--------------------------------------------------------
在第二个scanf(" %d",&amp;x);的%d前加个空格,以抵消上一个输入完成后的回车
----------------解决方案--------------------------------------------------------

这是因为你在输入数字时,肯定按了“回车”键,而回车键并不是像你想像的那样马上消失,它仍然保存在缓存区中,于是当遇到第二次提示要输入字符时,便不等你输入,电脑就将这个“回车”符默认是你输入进去的,由于“\n”是不等于“Y”的,这样就退出了循环;
也就是说,你将缓存区中的内容清除就万事大吉了!~
给你看看我该后的程序:(在vc环境下)
#include <stdio.h>
#include <stdlib.h>//新加入
#include <conio.h>
int main()
{
int t=0;
char flag='\0';
do
{ printf("\nPlease input the num :");
scanf("%d",&t);
fflush(stdin);//新加入
if (t%7==0)
printf("\nCannot be output!");

else
printf("\nthe number canbe output:%d",t);

printf("\nContinue?(Y/N)");
//do{
scanf("%c",&flag);
//}while(flag!='y'&&flag!='Y'&&flag!='n'&&flag!='N');
}while(flag=='y'||flag=='Y');
return 0;
}


[此贴子已经被作者于2007-9-2 18:36:46编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案