| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 925 人关注过本帖
标题:此段代码有些混乱,求指点。。
只看楼主 加入收藏
bits
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-5-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
此段代码有些混乱,求指点。。
char ch;
.......
while((ch=getchar())!=EOF)

一直以为,我输入的字符存储到ch中,结果今天才知道是getchar()的返回值存储在ch中并与EOF进行判断。

但是我搞不明白如果我在while循环里加入printf("ch is %c",ch); 发现我输入的字符还是保存在ch中。

这太令我矛盾了,希望各位指点一下。
搜索更多相关主题的帖子: 矛盾 
2013-05-15 16:06
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:7 
我混乱了

三十年河东,三十年河西,莫欺少年穷!
2013-05-15 16:54
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:7 
getchar()的返回值? 貌似就是你输入的字符啊..一次读一个字符

EOF是个特殊的字符..一个组合按键.CTRL + Z 或 CTRL + D(这个应该是UNIX系统吧..) ,表示文件的结尾,因为C默认是把键盘输入视为文件输入

ch = getchar() 先把一个字符赋给ch ,再用 ch 与 EOF 比较 ..

这个很难理解吗..

难道是我理解有错误?

看一下MinGW的stdio.h文件里的getchar

__CRT_INLINE int __cdecl __MINGW_NOTHROW getchar (void)
{
  return (--stdin->_cnt >= 0)
    ?  (int) (unsigned char) *stdin->_ptr++
    : _filbuf (stdin);
}

[ 本帖最后由 Ryker 于 2013-5-15 17:11 编辑 ]
2013-05-15 17:05
bits
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-5-14
收藏
得分:0 
回复 3楼 Ryker
关键是我现在不清楚ch里是什么内容在和EOF进行比较。 ,是用户输入的字符 还是getchar()的返回值? 还是我一开始就理解错了。。

以下摘自《C和指针》第五章 P70 最后一段:

-----------------------------------------------------------------------------------------------------------------------------------------------------------
    EOF需要的位数比字符型值所能提供的位数要多,这也是getchar返回一个整型值而不是字符型值得原因,然而,把getchar的返回值首先存储于ch中将导致它被截短。然后这个被截断的值被提升为整型并与EOF进行比较。当这段存在错误的代码在使用有符号字符集的机器上运行时,如果读取了一个值为\337的字节时,循环将会终止,因为这个值截断在提升之后与EOF相等。当这段代码在使用无符号字符集的机器上运行时,这个循环将永远不会停止。
-----------------------------------------------------------------------------------------------------------------------------------------------------------

这一段最后一句话也不理解

---------------The Art of program ---------------
2013-05-15 17:57
笑傲
Rank: 8Rank: 8
来 自:迪拜
等 级:蝙蝠侠
威 望:5
帖 子:223
专家分:856
注 册:2013-3-9
收藏
得分:7 
以下是引用bits在2013-5-15 17:57:03的发言:

关键是我现在不清楚ch里是什么内容在和EOF进行比较。 ,是用户输入的字符 还是getchar()的返回值? 还是我一开始就理解错了。。

以下摘自《C和指针》第五章 P70 最后一段:

-----------------------------------------------------------------------------------------------------------------------------------------------------------
    EOF需要的位数比字符型值所能提供的位数要多,这也是getchar返回一个整型值而不是字符型值得原因,然而,把getchar的返回值首先存储于ch中将导致它被截短。然后这个被截断的值被提升为整型并与EOF进行比较。当这段存在错误的代码在使用有符号字符集的机器上运行时,如果读取了一个值为\337的字节时,循环将会终止,因为这个值截断在提升之后与EOF相等。当这段代码在使用无符号字符集的机器上运行时,这个循环将永远不会停止。
-----------------------------------------------------------------------------------------------------------------------------------------------------------

这一段最后一句话也不理解

如果为无符号的,那么getchar()的返回值就是个无符号的值,和EOF比较肯定是不相等,那不就会一直循环下去嘛,终止不了;

练就一身本领,只为笑傲江湖!
2013-05-15 19:23
bits
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-5-14
收藏
得分:0 
回复 5楼 笑傲
哦对谢谢,真是蒙了。。。这都要问。。。。。

---------------The Art of program ---------------
2013-05-15 20:21
bits
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-5-14
收藏
得分:0 
有木有大神顺便帮忙看看这个。。
float a=0;
while(scanf("%f",&a)==0)
    printf("error");
如果用户输入了非浮点数。会提示error。。  加入我在标准输入流键入了 C然后'\n' 。为什么就无限循环了。。我认为应该循环两次,输入流就没东西了,可是结果差强人意哦。。

---------------The Art of program ---------------
2013-05-15 20:24
笑傲
Rank: 8Rank: 8
来 自:迪拜
等 级:蝙蝠侠
威 望:5
帖 子:223
专家分:856
注 册:2013-3-9
收藏
得分:0 
scanf每次都从缓冲区的开始位置读取数据,并且只获取需要的内容,剩余内容,譬如回车、空格等都还留在缓冲区。下次循环再执行scanf的时候,缓冲区里还有东西,就又把前面的剩余内容拿出来判断是不是它要读取的内容了

练就一身本领,只为笑傲江湖!
2013-05-15 21:09
bits
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-5-14
收藏
得分:0 
回复 8楼 笑傲
明白了谢谢

---------------The Art of program ---------------
2013-05-16 08:12
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:0 
一个小函数,清空缓冲区..需要的时候调用一下..

void clearcache(void)
{
    while(getchar() != '\n')
        continue;
}
2013-05-16 09:02
快速回复:此段代码有些混乱,求指点。。
数据加载中...
 
   



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

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