scanf的用法................

allen1981813 2003-10-20 06:15:00
问题1:如果下面的code把getchar()去掉后得到的结果是不一样的.出现一行倆Input:
问题2:留下getchar()在Input:后键如两个字符后,y/Y就没有作用了,而且出现一行倆Input:

我用的是VC++70
/////////////////////////////////////////////////////////////////
#include "stdafx.h"

#include <cstdio>
using namespace std;

int main()
{
while( true )
{
printf( "Input: " );

char c;
scanf( "%c", &c );
getchar();

if( c == 'y' || c == 'Y' )
break;
}

return 0;
}
...全文
50 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
TianGuangZao 2003-10-20
  • 打赏
  • 举报
回复
未定义行为(undefined behavior) 是标准 C 里的术语,简单说就是标准里没有说明,而和个别编译器的具体声明有关的一类行为,比如 i=i++。
也就意味着任何事情都可能发生。
对于 fflush() 函数在标准里规定只能作用于 stdout,而未规定 fflush(stdin) 的行为。
fflush(stdin) 可能 vc++6.0 里把它定义成清空缓冲区,但其它编译器环境可能什么都不是,甚至可能是完全相反的行为,如 gcc 下 fflush(stdin) 就失效了,从而程序违背了作者的本意,导致程序出现很奇怪的预想不到的错误。
对这类行为,平时应该注意避免,或用其它符合标准的方法代替。
具体请看:
http://www.eskimo.com/~scs/C-faq/q12.26.html
daizh 2003-10-20
  • 打赏
  • 举报
回复
to TianGuangZao(天光早) :
1. 如何能保证 getchar() 刚好捕捉到 '\n' 呢?
我仅就它的问题进行解释。
2、fflush(stdin) 是未定义行为,何意?

我将“我上面帖子解决办法”在vc++6.0下测试正常。
TianGuangZao 2003-10-20
  • 打赏
  • 举报
回复
Input: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: Input: y


壮观吧!根本不是 getchar() 可以解决的了的问题。程序太欠思考。

to daizh() :
1. 如何能保证 getchar() 刚好捕捉到 '\n' 呢?
2. fflush(stdin) 是未定义行为。
smj31 2003-10-20
  • 打赏
  • 举报
回复
必须有getchar语句,否则运行时在第二次循环过程中scanf语句将会被跳过,因此出现一行有两个input.
daizh 2003-10-20
  • 打赏
  • 举报
回复
问题1:
这是由于scanf( "%c", &c );执行后在输入流中有个'\n',如果不用getchar();捕获它,那么就导致下一次scanf( "%c", &c );捕获它,从而出现两个input:
问题2:
原因同上类似。

解决办法:在scanf()前加fflush(stdin);清除输入流,同时去掉getchar()
fflush(stdin);
scanf( "%c", &c );
Jinhao 2003-10-20
  • 打赏
  • 举报
回复
去掉getchar()
if(( c == 'y' )||( c == 'Y' ))

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧