荒于嬉 发表于 2019-10-17 21:08:57

关于getchar函数的读字符问题

代码如下
#include <stdio.h>

int main()
{
    int ch;
    printf("请输入一行英文句子:");
    ch=getchar();
    while(ch!='\n')
    {
                if(ch>='A'&&ch<='Z')
            {
                    ch+=32;
                }
                else if(ch>='a'&&ch<='z')
                        {
                                ch-=32;
                        }
                putchar(ch);
        }
    return 0;
}
“ch=getchar()”单独放置时会变成死循环,输入abc但是结果显示只读入了a。
把该语句放到while判断句中问题会解决,但是我想不太明白为什么放在外面会只读入一个字符并且不会终止,求解答
另外求助回帖时点了高级模式怎么返回回去

bin554385863 发表于 2019-10-17 21:13:24

本帖最后由 bin554385863 于 2019-10-17 21:14 编辑

{:10_266:}
getchar 一次只读入一个字符啊{:10_285:}
你到底有没有好好理解一下这个函数{:10_247:}

superbe 发表于 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),所以不会退出循环。

荒于嬉 发表于 2019-10-17 21:45:28

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

在循环体里面也就是while((ch=getchar())!='\n')时是正常运行的,会退出循环

荒于嬉 发表于 2019-10-17 21:48:06

bin554385863 发表于 2019-10-17 21:13
getchar 一次只读入一个字符啊
你到底有没有好好理解一下这个函数

我知道getchar()是逐次并且一次只读入一个字符,我是不知道什么时候开始读入下一个字符,是完成一次循环,还是其他的情况,就是类似于生存时间之类的

superbe 发表于 2019-10-17 21:49:56

是的,ch=getchar()放到while条件里是会正常退出的。我说的是你原来代码的问题。

荒于嬉 发表于 2019-10-17 21:54:23

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

上一个程序我做的是统计一串字符串中的大写字母个数,当时专门探究了把“ch=getchar()”放到外面和放到while里面的区别,发现结果一样,所以这个程序就直接在基础上修改,没想到会不行,就没想明白为什么这个程序就不行了

jackz007 发表于 2019-10-17 22:08:29

. . . . . .
    ch=getchar();
    while(ch!='\n')
. . . . . .
      你把 ch = getchar() 放在循环体外,那么,ch 在循环过程中始终没有机会得到改变,那无疑就是进入了死循环啊。

bin554385863 发表于 2019-10-17 23:52:32

本帖最后由 bin554385863 于 2019-10-17 23:53 编辑

#include <iostream>
int main(int argc, char const *argv[])
{
    char arg = '0';
    while ((arg = getchar()) != '\n')
    {
      if (!isalpha(arg))
      {
            std::cout << "请输入字母" << std::endl;
            break;
      }
      else
      {
            putchar(arg);
      }
    }
    return 0;
}

-------------------------------------------------
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>

荒于嬉 发表于 2019-10-18 09:23:49

jackz007 发表于 2019-10-17 22:08
. . . . . .
    ch=getchar();
    while(ch!='\n')


原来getchar()要放在循环体中才会改变,我原来以为就算独立成句也会逐个读入,现在知道了,谢谢你和其他诸位的答疑
页: [1]
查看完整版本: 关于getchar函数的读字符问题