asika2004 发表于 2021-2-17 11:39:34

13课后作业字符大小写问题

#include <stdio.h>
int main()
{
      char ch;
      printf("请输入英文字符以转化:\n");
      while ((ch = getchar())!='\n')
                {
                if(ch >='A'&& ch <='Z')
                {
                ch = ch + 32;
                }
                else if(ch >='a'&& ch <='z')
                {
                ch = ch - 32;
                }
                putchar(ch);
                }
      printf("\n");
      return 0;
}

while ((ch = getchar())!='\n')这段字符照理执行的是循环。我的理解是每输一个字幕循环一次,最后遇到\n结束。但输入一个字母就循环的话 就会执行循环内容输出putchar一次。即输一次显示一次。
为什么结果是输完全部后一起显示出来的?

asika2004 发表于 2021-2-17 11:42:59

是不是要这样理解:
一次输入(表达式)全部后,一个个判断 != ,每判断一次 循环一次

jackz007 发表于 2021-2-17 12:32:48

       getchar() 属于带缓冲的键盘输入函数,按下键盘的时候,字符会储存在键盘缓冲区,只有在按下回车键之后,getchar() 才能接收到由操作系统送过来的单个字符。

asika2004 发表于 2021-2-17 13:56:35

jackz007 发表于 2021-2-17 12:32
getchar() 属于带缓冲的键盘输入函数,按下键盘的时候,字符会储存在键盘缓冲区,只有在按下回车键 ...

那感觉 不是输完回车后。一堆字符会一起过来,ch就变成个字符串了?

jackz007 发表于 2021-2-17 14:06:00

       你看到的 "字符串" 效果是因为把 getchar() 放到循环里了,循环内的 getchar() 把键盘缓冲区内的字符全部取出并显示,从表面上看,就是取出字符串的效果,而实际上,ch 每次只能取到单个字符。

asika2004 发表于 2021-2-17 14:54:34

感谢,getchar() 是只能读取键盘缓存区1个字符

do8do8do8 发表于 2021-2-18 15:53:37

用getchar()是达不到你所要求的效果的
因为getchar()是在用户按回车键后才可以在stdin流里读字符,也就是不管你前面输入了多少个字符,唯有按下回车键
getchar才开始工作。
而这个函数是从缓冲区取数据,问题也就在这里:
例如输入:dfagadfageafea回车
这些数据就会被存进一个缓冲数组里(前提可以存得下),缓冲数组的内容是:dfagadfageafea回车
getchar()开始在这个数组里读取一个字符,若getchar()后面还有getchar()那么会自动读取下一个字符,后面还有那就继续
所以while( ...getchar()..)就可以自动读完所有的字符,getchar()确实每次只读一个字符,但是你没让它停下:它只知道每次读一个字符,但并不知道读多少次。
如果你想要每次读一个字符就让你再次输入
你得换个算法或者函数
页: [1]
查看完整版本: 13课后作业字符大小写问题