| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 929 人关注过本帖
标题:为什么输入.不退出循环?谢谢
只看楼主 加入收藏
刘俊杰
Rank: 2
等 级:论坛游民
帖 子:20
专家分:21
注 册:2014-12-6
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:11 
为什么输入.不退出循环?谢谢
#include<stdio.h>
int main()
{
    int letter=0,space=0,digit=0,others=0;
    char c;//用来读取每个字符
    while((c=getchar())!='\n')//当读入的是回车即为结束运算
    {
        if(c==' ')
        space++;
        else if((c>='1'&&c<='9'))
        digit++;
        else if((c>='a'&&c<='z')||c>='A'&&c<='Z')
        letter++;
        else if(c=='.')
            break;
        else others++;
    }
    printf("字母的个数等于:%d\n",letter);
    printf("空格的个数等于:%d\n",space);
    printf("数字的个数等于:%d\n",digit);
    printf("其它的个数等于:%d\n",others);
    return 0;
}
搜索更多相关主题的帖子: include letter others 字母 
2014-12-29 17:12
刘俊杰
Rank: 2
等 级:论坛游民
帖 子:20
专家分:21
注 册:2014-12-6
收藏
得分:0 
回复 楼主 刘俊杰
大神,大神在哪里
2014-12-29 18:04
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
else if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))

Only the Code Tells the Truth             K.I.S.S
2014-12-29 18:32
刘俊杰
Rank: 2
等 级:论坛游民
帖 子:20
专家分:21
注 册:2014-12-6
收藏
得分:0 
回复 3楼 longwu9t
有什么错误吗???
 else if(c=='.')
            break;
为什么输入.不退出循环?  谢谢
2014-12-30 07:23
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 4楼 刘俊杰
估计是那个分支走不到  也就是 ==点  这个判断语句没有被执行的机会

DO IT YOURSELF !
2014-12-30 13:32
monicamlg
Rank: 2
等 级:论坛游民
帖 子:7
专家分:13
注 册:2011-3-18
收藏
得分:5 
这个问题提的很好。首先你需要知道getchar()是怎么玩的。
[color=#FF0000]程序调用getchar()的时候,程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。这句话读2遍。

如果你输入 123... 然后回车 那结果是数字3个其他都为0.
如果你输入 ...123 然后回车 那结果全为0.

相信你现在已经明白了。
2014-12-30 17:03
刘俊杰
Rank: 2
等 级:论坛游民
帖 子:20
专家分:21
注 册:2014-12-6
收藏
得分:0 
回复 6楼 monicamlg
那是不是说只要输入一个点,然后点后面的字符电脑就不识别了,然而你还可以继续输入,不好意思我们还没接触“流”,“缓冲区呢”,谢谢
2014-12-31 12:28
刘俊杰
Rank: 2
等 级:论坛游民
帖 子:20
专家分:21
注 册:2014-12-6
收藏
得分:0 
回复 2楼 刘俊杰
那是不是键盘上所有的字符以及别的什么键都被机器内部赋值成数字了???谢谢
2014-12-31 12:38
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:10 
回复 7楼 刘俊杰
我觉得你可以这么理解:
通常情况下我们编写C程序接受输入的时候,会发生下面的事情
1、我们敲击键盘,比如按下了字母a,这个时候程序并不会立即处理字母a,而是将字母a放入称为缓冲区的地方。
2、然后,我们再敲击键盘,比如按下了字母b,这个时候程序也不会立即处理字母b,而是将字母b放入缓冲区。这个时候缓冲区就有字母a和b了。
3、当触发相关的事件后,程序才会处理缓冲区中输入的字符,比如按下回车键。
所以,虽然我们调用的时getchar()函数,程序并不会在我们按下一个字符后立即进行处理,通常情况下我们按下回车键的时候才处理。

如果我们依次按下了abc123.efg这10个键后并且按下回车键,缓冲区会有11个字符,分别为'a'、'b'、'c'、'1'、'2'、'3'、'.'、'e'、'f'、'g'、'\n'。
只有在这个时候getchar()函数才会开始处理,也就是从缓冲区中取出一个字符。第一次循环取出'a'第二次循环取出'b'...

因此,你会看到一个奇怪的现象,每次按下一个键,屏幕都会显示出我们想要输入的字符,貌似按下之后你那个while循环体里面的代码都执行了。
按照逻辑,在按下'.'的时候,程序应该退出循环体,并且打印结果了。但实际情况却不是这样,按下'.'后,结果并没有打印,继续按下键盘,屏幕依然显示处输入的字符。直到我们按下回车键。
真相是这样的:不论时你按下'.'之前的字符,还是'.',还是'.'之后回车键之前的字符,while循环体里面的代码并没有执行。直到你按下回车键,while循环体中的代码才真正开始执行。

getchar()函数所在的C标准库这么做,是为了减少系统调用的次数,提高性能。
2014-12-31 13:21
刘俊杰
Rank: 2
等 级:论坛游民
帖 子:20
专家分:21
注 册:2014-12-6
收藏
得分:0 
回复 9楼 八画小子
谢谢
2014-12-31 14:30
快速回复:为什么输入.不退出循环?谢谢
数据加载中...
 
   



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

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