关于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:14 编辑
{:10_266:}
getchar 一次只读入一个字符啊{:10_285:}
你到底有没有好好理解一下这个函数{:10_247:}
本帖最后由 superbe 于 2019-10-20 09:29 编辑
ch=getchar();读入一个字符,除非你是直接回车的,否则while(ch!='\n')在判断条件的时候一直是满足的,所以死循环了。
在循环体里面ch+32或ch-32也不会使ch的值变成\n的ascii码(10),所以不会退出循环。 superbe 发表于 2019-10-17 21:41
ch=getchar();读入一个字符,除非你是直接回车的,否则while(ch!='\n')在判断条件的时候一直是满足的,所以 ...
在循环体里面也就是while((ch=getchar())!='\n')时是正常运行的,会退出循环 bin554385863 发表于 2019-10-17 21:13
getchar 一次只读入一个字符啊
你到底有没有好好理解一下这个函数
我知道getchar()是逐次并且一次只读入一个字符,我是不知道什么时候开始读入下一个字符,是完成一次循环,还是其他的情况,就是类似于生存时间之类的 是的,ch=getchar()放到while条件里是会正常退出的。我说的是你原来代码的问题。 superbe 发表于 2019-10-17 21:49
是的,ch=getchar()放到while条件里是会正常退出的。我说的是你原来代码的问题。
上一个程序我做的是统计一串字符串中的大写字母个数,当时专门探究了把“ch=getchar()”放到外面和放到while里面的区别,发现结果一样,所以这个程序就直接在基础上修改,没想到会不行,就没想明白为什么这个程序就不行了 . . . . . .
ch=getchar();
while(ch!='\n')
. . . . . .
你把 ch = getchar() 放在循环体外,那么,ch 在循环过程中始终没有机会得到改变,那无疑就是进入了死循环啊。 本帖最后由 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> jackz007 发表于 2019-10-17 22:08
. . . . . .
ch=getchar();
while(ch!='\n')
原来getchar()要放在循环体中才会改变,我原来以为就算独立成句也会逐个读入,现在知道了,谢谢你和其他诸位的答疑
页:
[1]