鱼C论坛

 找回密码
 立即注册
查看: 1128|回复: 9

[已解决]关于getchar函数的读字符问题

[复制链接]
发表于 2019-10-17 21:08:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int ch;
  5.     printf("请输入一行英文句子:");
  6.     ch=getchar();
  7.     while(ch!='\n')
  8.     {
  9.                 if(ch>='A'&&ch<='Z')
  10.             {
  11.                     ch+=32;
  12.                 }
  13.                 else if(ch>='a'&&ch<='z')
  14.                         {
  15.                                 ch-=32;
  16.                         }
  17.                 putchar(ch);
  18.         }
  19.     return 0;
  20. }
复制代码

“ch=getchar()”单独放置时会变成死循环,输入abc但是结果显示只读入了a。
把该语句放到while判断句中问题会解决,但是我想不太明白为什么放在外面会只读入一个字符并且不会终止,求解答
另外求助回帖时点了高级模式怎么返回回去
最佳答案
2019-10-17 22:08:29
. . . . . .
    ch=getchar();
    while(ch!='\n')
. . . . . .
        你把 ch = getchar() 放在循环体外,那么,ch 在循环过程中始终没有机会得到改变,那无疑就是进入了死循环啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-17 21:13:24 | 显示全部楼层
本帖最后由 bin554385863 于 2019-10-17 21:14 编辑


getchar 一次只读入一个字符啊
你到底有没有好好理解一下这个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-17 21:41:52 | 显示全部楼层
本帖最后由 superbe 于 2019-10-20 09:29 编辑

ch=getchar();读入一个字符,除非你是直接回车的,否则while(ch!='\n')在判断条件的时候一直是满足的,所以死循环了。
在循环体里面ch+32或ch-32也不会使ch的值变成\n的ascii码(10),所以不会退出循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 21:45:28 | 显示全部楼层
superbe 发表于 2019-10-17 21:41
ch=getchar();读入一个字符,除非你是直接回车的,否则while(ch!='\n')在判断条件的时候一直是满足的,所以 ...

在循环体里面也就是while((ch=getchar())!='\n')时是正常运行的,会退出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 21:48:06 | 显示全部楼层
bin554385863 发表于 2019-10-17 21:13
getchar 一次只读入一个字符啊
你到底有没有好好理解一下这个函数

我知道getchar()是逐次并且一次只读入一个字符,我是不知道什么时候开始读入下一个字符,是完成一次循环,还是其他的情况,就是类似于生存时间之类的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-17 21:49:56 | 显示全部楼层
是的,ch=getchar()放到while条件里是会正常退出的。我说的是你原来代码的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 21:54:23 | 显示全部楼层
superbe 发表于 2019-10-17 21:49
是的,ch=getchar()放到while条件里是会正常退出的。我说的是你原来代码的问题。

上一个程序我做的是统计一串字符串中的大写字母个数,当时专门探究了把“ch=getchar()”放到外面和放到while里面的区别,发现结果一样,所以这个程序就直接在基础上修改,没想到会不行,就没想明白为什么这个程序就不行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-17 22:08:29 | 显示全部楼层    本楼为最佳答案   
. . . . . .
    ch=getchar();
    while(ch!='\n')
. . . . . .
        你把 ch = getchar() 放在循环体外,那么,ch 在循环过程中始终没有机会得到改变,那无疑就是进入了死循环啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-17 23:52:32 | 显示全部楼层
本帖最后由 bin554385863 于 2019-10-17 23:53 编辑
  1. #include <iostream>
  2. int main(int argc, char const *argv[])
  3. {
  4.     char arg = '0';
  5.     while ((arg = getchar()) != '\n')
  6.     {
  7.         if (!isalpha(arg))
  8.         {
  9.             std::cout << "请输入字母" << std::endl;
  10.             break;
  11.         }
  12.         else
  13.         {
  14.             putchar(arg);
  15.         }
  16.     }
  17.     return 0;
  18. }
复制代码

-------------------------------------------------
E:\Users\86184\Documents\Code>c:\Users\86184\.vscode\extensions\ms-vscode.cpptools-0.26.0\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-5242uzf1.0cg --stdout=Microsoft-MIEngine-Out-sx5hiih2.zxr --stderr=Microsoft-MIEngine-Error-kdao2aw3.l4z --pid=Microsoft-MIEngine-Pid-orszt3rw.svq "--dbgExe=E:\My Program\MinGW\bin\gdb.exe" --interpreter=mi
0123
请输入字母


E:\Users\86184\Documents\Code>cmd /C "c:\Users\86184\.vscode\extensions\ms-vscode.cpptools-0.26.0\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-cfkcl3zd.iox --stdout=Microsoft-MIEngine-Out-k42wqt54.g54 --stderr=Microsoft-MIEngine-Error-ha5rx422.o0k --pid=Microsoft-MIEngine-Pid-if041scy.ovb "--dbgExe=E:\My Program\MinGW\bin\gdb.exe" --interpreter=mi "
hello
hello

E:\Users\86184\Documents\Code>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-18 09:23:49 | 显示全部楼层
jackz007 发表于 2019-10-17 22:08
. . . . . .
    ch=getchar();
    while(ch!='\n')

原来getchar()要放在循环体中才会改变,我原来以为就算独立成句也会逐个读入,现在知道了,谢谢你和其他诸位的答疑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 07:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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