傻狍子嗷 发表于 2020-1-1 14:00:09

关于getchar()的疑问

楼主写小甲鱼"带你学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;
}运行结果:
另一种代码
#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;
}运行结果:

如图

望鱼油们解答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;

jackz007 发表于 2020-1-1 15:36:40

本帖最后由 jackz007 于 2020-1-1 15:40 编辑

while (getchar() != '\n')
    {
      if ((getchar() >= 'A') && (getchar() <= 'Z'))
      这个代码问题好大,每判断一个输入字符,会至少执行 2 次,甚至 3 次 getchar(),而这个函数每执行一次,都会从键盘读取一个字符,就是说,你实际输入了 2 或 3 个字符,程序才会按输入了 1 个字符进行统计 ,这是楼主的预期吗?

不会停下 发表于 2020-1-1 18:21:18

//输入ABC

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

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

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

sunrise085 发表于 2020-1-2 15:06:37

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