| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1088 人关注过本帖
标题:奇怪的scanf,这个地方必须加循环才能输入??
只看楼主 加入收藏
hahahan
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-4-10
收藏
 问题点数:0 回复次数:7 
奇怪的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 
2007-09-01 11:41
critaxu
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-8-29
收藏
得分:0 
这你仔细看下do while{}的运行流程就知道了

想改变不可能,只有努力!努力不等于成功,可是不努力,就一定不会成功。
2007-09-01 12:24
vbc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:352
专家分:147
注 册:2006-12-30
收藏
得分:0 

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


清远鹏程万里人才网:[url=http://www.]http://www.[/url]zq.,qy.
2007-09-01 13:16
hahahan
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-4-10
收藏
得分:0 
回复:(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连用,而且运行竟然不出问题的例子(比如连续两次简单的数字输入)???

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


没事儿你就多到这儿转转
2007-09-01 16:15
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
得分:0 

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

2007-09-01 19:30
vbc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:352
专家分:147
注 册:2006-12-30
收藏
得分:0 

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


清远鹏程万里人才网:[url=http://www.]http://www.[/url]zq.,qy.
2007-09-02 09:17
学技术的
Rank: 2
等 级:论坛游民
帖 子:91
专家分:45
注 册:2007-8-5
收藏
得分:0 
在第二个scanf(" %d",&amp;x);的%d前加个空格,以抵消上一个输入完成后的回车
2007-09-02 11:18
peswe
Rank: 1
等 级:新手上路
帖 子:197
专家分:0
注 册:2006-11-22
收藏
得分:0 

这是因为你在输入数字时,肯定按了“回车”键,而回车键并不是像你想像的那样马上消失,它仍然保存在缓存区中,于是当遇到第二次提示要输入字符时,便不等你输入,电脑就将这个“回车”符默认是你输入进去的,由于“\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编辑过]


C斗士~~~fighting!!!!
2007-09-02 14:52
快速回复:奇怪的scanf,这个地方必须加循环才能输入??
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026507 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved