| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 895 人关注过本帖
标题:getchar()在 while 循环中多显示一次
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用aneeg在2014-4-22 18:53:01的发言:

我当然知道EOF和"\n"不是同一个字符,这结果不是我想要的

你从来就没说你到底想干吗   一直是大伙在猜

DO IT YOURSELF !
2014-04-22 20:51
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
回复 10 楼 aneeg
EOF的值为-1, \n的值为0.

在一楼的代码运行时, 你输入的字符后面的第一个值是0,然后才是-1.  所以仍旧要执行一次printf函数, 所以你输入一个字符会出现两行.

其实, 现在我更感兴趣的是你在8楼发的那段代码. 为什么会出现那样的结果.  

#include<stdio.h>
int main(void)
{
    while(getchar()!='eof'){
        printf("中华人民和国\n") ;
        while(getchar()!='\n')
        break;
    }
    return 0;
}

不知道楼主注意没有, 这段代码如果编译出来成为一个程序的话是没法结束的.除非是通过外部程序强行结束.  也就是说, 你仅仅通过键盘是无法让这个程序在cmd下或者dos下显示"请按任意键继续..."的. 除非你关闭了cmd窗口,但这样结束是因为你关闭了它的宿主或者它赖以运行的操作系统来关闭的.
在你运行这段程序后, 屏幕会暂时停顿一下, 光标一直在最左端闪,你可以什么都不输入,然后一直按Enter,你会发现,每按两次Enter,输出一个"中华人民共和国".
但有个问题,我不明白, 为什么会出现输入6个字符有的时候输出三行,有的时候输出四行的情况.  请大神指点迷津,谢谢.

代码测试环境:  WinXP+C-Free5.0.
2014-04-24 02:10
a6670892
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2014-4-25
收藏
得分:0 
回复 12 楼 vvvcuu
#include<stdio.h>
int main(void)
{
    while(getchar()!=EOF)
    printf("中华人民共和国\n");
    return 0;
}这个我要输入一个字母就输出一次,比如ABC就输出3次,那要怎么改呢?
2014-04-25 01:03
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
回复 13 楼 a6670892
把EOF改成'\n'就可以了. 而且,这样程序就可以正常退出了.

程序代码:
#include<stdio.h>
int main(void)
{
    while(getchar()!='\n')              //这里\n只能使用单引号,而且必须用单引号.否则报错.
    printf("中华人民共和国\n");
    return 0;
}


代码测试环境:  WinXP+C-Free5.0.
2014-04-25 06:12
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 12 楼 vvvcuu
你输入的哪六个字符出现了三次输出啊?

未知令人期待!
2014-04-26 03:30
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
回复 15 楼 神机军师
你好.输入6个字符出现3次输出,是指的这段代码,好像是楼主在8楼贴出来的.
程序代码:
#include<stdio.h>
int main(void)
{
    while(getchar()!='eof'){
        printf("中华人民和国\n") ;
        while(getchar()!='\n')
        break;
    }
    return 0;
}


注意:  这段代码不会退出的,尽管有"return 0;",但程序并不会结束.  当你输入6个字符时,会输入4次,继续输入6个字符,则输出编程了3次.  我不明白的是为什么会这样. 两个while是如何执行的? 可能我不会调试吧,试着跟踪了一下,没整明白.

代码测试环境:  WinXP+C-Free5.0.
2014-04-26 07:38
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 16 楼 vvvcuu
注意:  这段代码不会退出的,尽管有"return 0;",但程序并不会结束.  当你输入6个字符时,会输入4次,继续输入6个字符,则输出编程了3次.  我不明白的是为什么会这样. 两个while是如何执行的? 可能我不会调试吧,试着跟踪了一下,没整明白.

不会退出是这样子的,break只跳出那个while循环,而不管怎么样都不会输出eof的那个字符,(如果用printf打印%d格式的eof是一个很大的帧数,如果是%u格式则和前面不一一样,不过也是个很大的整数。。)
你输入个格式应该是 abcdef回车abcdef回车  这样的形式吧
回车只是一次输入
图片附件: 游客没有浏览图片的权限,请 登录注册

第一次是 a c e 回车 的时候判定getchar()!='eof' 这是输出的四次
而b d f这三次是进行
while(getchar()!='\n')
        break;
会发现不论怎么进行,
如果是回车换行符那么就是输入的'\n'此时不满足getchar()!='\n'的循环条件,不进行while循环语句
如果不是回车换行符,进行break语句,跳出这个while循环,重新进行外面的大循环。
当最后(即第七次判定的回车换行符)依照顺序是判定最外层的那个while(getchar()!='eof')
这时候输出了四次结果
第二次输入的六个字符,其实也是 abcdef回车
这时候,a判定内层while(getchar()!='\n')的条件,然后依次序是
a c e 回车  这四次判定内层,而b d f则是判定外层那个,对应的三次输出
最后一个的回车换行符依照顺序是判定内层循环的,
所以第二次输入六个字符输出三次结果。

如果你还是六个六个的输入,那么后面也是输出四次,输出三次,输出四次。。。
这样进行下去。。

未知令人期待!
2014-04-26 11:57
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
回复 17 楼 神机军师
是不是应该这样理解(程序这样执行):

当我输入"abcdef回车"的时候,  程序首先执行
while(getchar()!='eof')
, 而getchar()一次只接收一个字符,因此首先检查a!='EOF',于是执行

printf("中华人民和国\n") ;


然后执行
while(getchar()!='\n')


此时的getchar()返回的字符已经不是a了,而是b了,对吗?

break结束的仅仅是
while(getchar()!='\n')
这个循环.

另外,  getchar()在stdin设备中是不是永远都不会返回-1这个值?只有读取文件的时候才有可能返回-1?

代码测试环境:  WinXP+C-Free5.0.
2014-04-26 12:23
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 18 楼 vvvcuu
流程基本就是这样子的

至于:
另外,  getchar()在stdin设备中是不是永远都不会返回-1这个值?只有读取文件的时候才有可能返回-1?


getchar()的函数原型是int getchar(void);
返回值是个int型,而ASCII码的取值是[-128,127]的范围的,通过标准输入是找不到在取值范围外对应的eof的字符的。(如果没有宏定义EOF,用printf打印%d格式的eof是一个很大的整数,如果是%u格式则和前面不一一样,不过也是个很大的整数。。)

如果getchar()碰到了文件结束标志或发生读错误,它会返回一个EOF。这好像就是几个碰到EOF的情况吧

未知令人期待!
2014-04-26 12:50
快速回复:getchar()在 while 循环中多显示一次
数据加载中...
 
   



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

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