| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2862 人关注过本帖
标题:问一个关于getchar()吃回车的问题~!(初学者)
只看楼主 加入收藏
ivfjingren
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-14
收藏
 问题点数:0 回复次数:11 
问一个关于getchar()吃回车的问题~!(初学者)

#include "stdio.h"
main()
{int a,i,max;
scanf("%d",&max);
for(i=1;i<=9;i++)
{scanf("%d",&a);
if(max<a)
max=a;
}
printf("max=%d",max);
}


对于这个求10个数中最大的数的程序~!

每输一个数字,都要有一个回车或空格来与下一个数字区别吧,我觉得每输一个回车或空格都要用getchar()来清楚掉~!不然计算机是不是就会把回车或空格当字符呢~!~??可是没有getchar()程序好像运行得很正常~!


搜索更多相关主题的帖子: getchar 回车 
2007-03-16 17:16
ivfjingren
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-14
收藏
得分:0 
回复:(ivfjingren)问一个关于getchar()吃回车的问题...

是不是加getchar()和不加都可以呢?/

我刚刚加了一下,好像也是可以的`!

可是我还是觉得一定要加的~!

2007-03-16 17:19
pinglideyu
Rank: 3Rank: 3
来 自:武汉工程大学
等 级:论坛游侠
威 望:1
帖 子:735
专家分:140
注 册:2007-1-7
收藏
得分:0 
我也常碰到这样的问题,顶哟。我也觉得最好加。

~~我的明天我知道~~
2007-03-16 17:21
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 

有可能是这个原因,用%d输入时,遇到非数字的字符就会终止,不相信你去试试这个

#include "stdio.h"
main()
{int i;
scanf("%d",&i);
printf("%d\n",i);

}

输入56gft
输出结果为56


雁无留踪之意,水无取影之心
2007-03-16 17:28
vlongsoft
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-3-16
收藏
得分:0 


刚刚在看到的一篇文章, 希望能有所帮助 。

C/C++ 误区二

—— fflush(stdin)

作者:antigloss http://free3.e-168.cn/antigloss/


1. 为什么 fflush(stdin) 是错的

首先请看以下程序:
#include<stdio.h>


int main( void )

{

int i;

for (;;) {

fputs("Please input an integer: ", stdout);


scanf("%d", &i);

printf("%d\n", i);

}

return 0;

}

这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。

也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着 fflush on input stream is an extension to the C standard (fflush 操作输入流是对C标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义:

int fflush(FILE *stream);


如果stream指向输出流或者更新流(update stream),并且这个更新流 鐽巃劖]?? 最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream 茘-秛驨尔 指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。 5p>洿[杫x? fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush 肽稨撶*)"` 函数会给那些流打上错误标记,并且返回EOF,否则返回0。


由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的,至少是移植性不好的。


2. 清空输入缓冲区的方法

虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。

/* C 版本 */

#include<stdio.h>


int main( void )

{

int i, c;

for (;;) {

fputs("Please input an integer: ", stdout);

scanf("%d", &i);

/* while循环会把输入缓冲中的残留字符清空 */

/* 读者可以根据需要把它改成宏或者内联函数 */

/* 注:C99中也定义了内联函数,gcc3.2支持 */

while ( (c=getchar()) != '\n' && c != EOF ) {

;

} /* end of while */

printf("%d\n", i);

}

return 0;

}


/* C++ 版本 */


#include <iostream>


#include <limits> // 为了使用numeric_limits


using std::cout;


using std::endl;


using std::cin;


int main( )


{


int value;


for (;;) {


cout << "Enter an integer: ";


cin >> value;

/* 读到非法字符后,输入流将处于出错状态,

* 为了继续获取输入,首先要调用clear函数

* 来清除输入流的错误标记,然后才能调用

* ignore函数来清除输入缓冲区中的数据。 */


cin.clear( );


/* numeric_limits<streamsize>::max( ) 返回缓冲区的大小。

* ignore 函数在此将把输入缓冲区中的数据清空。

* 这两个函数的具体用法请读者自行查询。 */


cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );


cout << value << '\n';


}

return 0;


}


参考资料:ISO/IEC 9899:1999 (E) Programming languages — C 蚣狵岅覺啁 7.19.5.2 The fflush function
The C Programming Language 2nd Edition By Kernighan & Ritchie
ISO/IEC 14882(1998-9-01)Programming languages — C++

2007-03-16 17:44
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
输入数时回车符是不会被接收的,而输入字符会发生这样的情况.

倚天照海花无数,流水高山心自知。
2007-03-16 19:03
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
LS的能解释一下这个帖吗?

http://bbs.bc-cn.net/viewthread.php?tid=124266

雁无留踪之意,水无取影之心
2007-03-16 19:13
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

看了一下这个帖,LS你要我解释什么?


倚天照海花无数,流水高山心自知。
2007-03-16 19:24
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
就像这个,为什么一定要加GETCH();


#include "stdio.h"
main()
{int i;
char a[3];
for(i=0;i<3;i++)
{ scanf("%c",&a[i]);
getchar();
}
for(i=0;i<3;i++)
printf("%c",a[i]);
}

雁无留踪之意,水无取影之心
2007-03-16 19:42
ivfjingren
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-14
收藏
得分:0 
以下是引用PcrazyC在2007-3-16 19:13:20的发言:
LS的能解释一下这个帖吗?

http://bbs.bc-cn.net/viewthread.php?tid=124266

这个是我问的,我也明白了!

可是正是因为明白了我才对我有时候不加getchar()有疑问啊\!`

2007-03-16 23:49
快速回复:问一个关于getchar()吃回车的问题~!(初学者)
数据加载中...
 
   



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

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