1613551 发表于 2022-8-8 09:10:27

关于getchar的问题

为什么这段程序,在键盘上输入12345#,输出的是13,而不是12345呢?

#include <stdio.h>
int main(void)
{
char c;
for (c = getchar(); getchar() != '#'; c = getchar())
{
    putchar(c);
}
return 0;
}

jackz007 发表于 2022-8-8 10:19:30

本帖最后由 jackz007 于 2022-8-8 10:23 编辑

      问题出在你使用了 3 个 getchar(),每一个都会消减一个键盘输入字符,其中,用于判断的那一个更是没有被保存,直接被丢弃,所以,最后,只有部分输入内容被显示出来。
       要解决问题很简单,把键盘输入和判断统一到同一个 getchar() 上。
      for(; (c = getchar) != '#' ;)

iMarkWu 发表于 2022-8-8 10:22:04

本帖最后由 iMarkWu 于 2022-8-8 10:26 编辑

for (c = getchar(); getchar() != '#'; c = getchar())
因为你的判断条件也是getchar(),也读入了一个字符。

所以输入12345#运行情况:
c = getchar()   // 读入1,c=1
getchar() != '#'    // 读入2, c=1, '2' != '#'符合条件,输出c
c = getchar()    // 读入3, c=3
getchar() != '#'    // 读入4,c=3, '4' != '#'符合条件,输出c
......

修改方法:
for (c = getchar(); c != '#'; c = getchar())

临时号 发表于 2022-8-8 10:27:33

执行结果是13
首先,for循环进入初始化,c=getchar()读到了1,并将1赋值给了c
然后,for循环进入了条件’判断,getchar()!='#'又读到了2,因为不等于#,所以进了循环,输出了c,也就是1
然后,for循环执行了循环后需要执行的c=getchar()又读到了3,并将3赋值给了c
然后,for循环又进入了条件判断,getchar()!='#'又读到了4,因为不等yu#,所以进了循环,输出了c,也就是3
然后,for循环执行了循环后需要执行的c=getchar()又读到了5,并将5赋值给了c
最后,for循环进入了条件’判断,getchar()!='#'又读到了#,因为#等于#,条件不符合,所以退出了循环,程序结束

如果你想要输出12345的话,需将程序写成
char c;
for(c=getchar();c!='#';c=getchar()){
    putchar(c);
}

额外减小 发表于 2022-8-8 22:21:38

3次调用getchar函数,每个getchar都会从stdin中读走1个字符,所以c变量前后只被赋值为1和3{:10_249:}
页: [1]
查看完整版本: 关于getchar的问题