鱼C论坛

 找回密码
 立即注册
查看: 1573|回复: 4

[已解决]关于getchar()的疑问

[复制链接]
发表于 2020-1-1 14:00:09 | 显示全部楼层 |阅读模式
6鱼币
楼主写小甲鱼"带你学C带你飞"s1e13的课后作业时
产生了下面这个疑问:
char ch;
ch = getchar();
如果ch是getchar()的值,那么,下面两种代码的执行结果为何不同
#include <stdio.h>

int main()
{
    char ch;
    int count = 0;
    printf("请输入一串英文字符: ");
    while ((ch = getchar()) != '\n')
    {
        if ((ch >= 'A') && (ch <= 'Z'))
        {
            count++;
        }
    }
    printf("您输入了 %d 个大写字母\n", count);

    return 0;
}
运行结果: 2020-01-01 13-40-21 的屏幕截图.png
另一种代码
#include <stdio.h>

int main()
{
    char ch;
    int count = 0;
    printf("请输入一串英文字符: ");
    while (getchar() != '\n')
    {
        if ((getchar() >= 'A') && (getchar() <= 'Z'))
        {
            count++;
        }
    }
    printf("您输入了 %d 个大写字母\n", count);

    return 0;
}
运行结果:
2020-01-01 13-39-38 的屏幕截图.png
如图

望鱼油们解答qwq
最佳答案
2020-1-1 14:00:10
getchar()是一个函数,你每写一次,就会调用一次函数,读取你输入的字符并返回该字符。同时你要知道,getchar()一次只能读取一个数据,下次再读取的时候就是下一个数据了。
第二个代码中,首先你输入的是“ABC”,执行while()的判断条件时,getchar()读取的是A,所以getchar()!=‘\n’值为1,所以while()条件为1,执行循环,然后if()的条件判断,第一个getchar()读取的是B,所以getchar()>'=A'值为1,第二个getchar()读取的是C,getchar()<='\Z'值为1,所以if()判断条件为1,所以count值变为1。到这里,一个循环执行完了,之后就进行第二次的while()条件判断,所以getchar()再次读取字符,但前三个字母已经读完了,下一个就是回车也就是'\n',条件值为0,不执行循环,最后printf()运行出来的count值为1,到此程序结束。
当然,这只是我的个人看法,如有错误,还请批评指正&#129309;

最佳答案

查看完整内容

getchar()是一个函数,你每写一次,就会调用一次函数,读取你输入的字符并返回该字符。同时你要知道,getchar()一次只能读取一个数据,下次再读取的时候就是下一个数据了。 第二个代码中,首先你输入的是“ABC”,执行while()的判断条件时,getchar()读取的是A,所以getchar()!=‘\n’值为1,所以while()条件为1,执行循环,然后if()的条件判断,第一个getchar()读取的是B,所以getchar()>'=A'值为1,第二个getchar()读取的是C ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-1 14:00:10 | 显示全部楼层    本楼为最佳答案   
getchar()是一个函数,你每写一次,就会调用一次函数,读取你输入的字符并返回该字符。同时你要知道,getchar()一次只能读取一个数据,下次再读取的时候就是下一个数据了。
第二个代码中,首先你输入的是“ABC”,执行while()的判断条件时,getchar()读取的是A,所以getchar()!=‘\n’值为1,所以while()条件为1,执行循环,然后if()的条件判断,第一个getchar()读取的是B,所以getchar()>'=A'值为1,第二个getchar()读取的是C,getchar()<='\Z'值为1,所以if()判断条件为1,所以count值变为1。到这里,一个循环执行完了,之后就进行第二次的while()条件判断,所以getchar()再次读取字符,但前三个字母已经读完了,下一个就是回车也就是'\n',条件值为0,不执行循环,最后printf()运行出来的count值为1,到此程序结束。
当然,这只是我的个人看法,如有错误,还请批评指正&#129309;

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
傻狍子嗷 + 5 + 5 + 3 谢谢解答~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-1 15:36:40 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2020-1-1 15:40 编辑
while (getchar() != '\n')
    {
        if ((getchar() >= 'A') && (getchar() <= 'Z'))
        这个代码问题好大,每判断一个输入字符,会至少执行 2 次,甚至 3 次 getchar(),而这个函数每执行一次,都会从键盘读取一个字符,就是说,你实际输入了 2 或 3 个字符,程序才会按输入了 1 个字符进行统计 ,这是楼主的预期吗?

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
傻狍子嗷 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-1 18:21:18 | 显示全部楼层
//输入ABC

while (getchar() /*此处接收到的是 A*/ != '\n')
    {
        if ((getchar() /*此处接收到的是 B*/  >= 'A') && (getchar() /*此处接收到的是 C*/ <= 'Z'))
        {
            count++;
        }
//接收完毕循环结束
    }
getchar()是接收键盘录入的,每次接收一个字符。

你的第二种方法:每执行一次while循环,就会执行3次getchar()方法,每个地方判断的字符也就不是同一个啦。

这种问题下个断点,debug一下就能看出来了,其实没必要出来问别人的啦。

评分

参与人数 2荣誉 +7 鱼币 +5 贡献 +3 收起 理由
傻狍子嗷 + 5 + 5 + 3
WuLi小明 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-2 15:06:37 | 显示全部楼层
getchar()是一个函数哎!在程序中每写一次,就会调用一次,从输入端读一个字符。你的第二种写法,while循环一次会从输入终端读取二到三个字符。这样的话,while判断的时候所用的字符和if判断所用的根本不是一个字符,而且if语句还很容易把'\n'刷过去,导致while读不到'\n'而无法终止循环。当然会感觉程序有问题啦。
估计你对getchar()函数理解还不够。可以网上查资料看一下。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
傻狍子嗷 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表