鱼C论坛

 找回密码
 立即注册
查看: 973|回复: 6

[已解决]13课后作业字符大小写问题

[复制链接]
发表于 2021-2-17 11:39:34 | 显示全部楼层 |阅读模式

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

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

x
#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一次。即输一次显示一次。
为什么结果是输完全部后一起显示出来的?
最佳答案
2021-2-18 15:53:37
用getchar()是达不到你所要求的效果的
因为getchar()是在用户按回车键后才可以在stdin流里读字符,也就是不管你前面输入了多少个字符,唯有按下回车键
getchar才开始工作。
而这个函数是从缓冲区取数据,问题也就在这里:
例如输入:dfagadfageafea回车
这些数据就会被存进一个缓冲数组里(前提可以存得下),缓冲数组的内容是:dfagadfageafea回车
getchar()开始在这个数组里读取一个字符,若getchar()后面还有getchar()那么会自动读取下一个字符,后面还有那就继续
所以while( ...getchar()..)就可以自动读完所有的字符,getchar()确实每次只读一个字符,但是你没让它停下:它只知道每次读一个字符,但并不知道读多少次。
如果你想要每次读一个字符就让你再次输入
你得换个算法或者函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-17 11:42:59 | 显示全部楼层
是不是要这样理解:
一次输入(表达式)全部后,一个个判断 != ,每判断一次 循环一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-17 12:32:48 | 显示全部楼层
       getchar() 属于带缓冲的键盘输入函数,按下键盘的时候,字符会储存在键盘缓冲区,只有在按下回车键之后,getchar() 才能接收到由操作系统送过来的单个字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-17 13:56:35 | 显示全部楼层
jackz007 发表于 2021-2-17 12:32
getchar() 属于带缓冲的键盘输入函数,按下键盘的时候,字符会储存在键盘缓冲区,只有在按下回车键 ...

那感觉 不是输完回车后。一堆字符会一起过来,ch就变成个字符串了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-17 14:06:00 | 显示全部楼层
       你看到的 "字符串" 效果是因为把 getchar() 放到循环里了,循环内的 getchar() 把键盘缓冲区内的字符全部取出并显示,从表面上看,就是取出字符串的效果,而实际上,ch 每次只能取到单个字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-17 14:54:34 | 显示全部楼层
感谢,getchar() 是只能读取键盘缓存区1个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-18 15:53:37 | 显示全部楼层    本楼为最佳答案   
用getchar()是达不到你所要求的效果的
因为getchar()是在用户按回车键后才可以在stdin流里读字符,也就是不管你前面输入了多少个字符,唯有按下回车键
getchar才开始工作。
而这个函数是从缓冲区取数据,问题也就在这里:
例如输入:dfagadfageafea回车
这些数据就会被存进一个缓冲数组里(前提可以存得下),缓冲数组的内容是:dfagadfageafea回车
getchar()开始在这个数组里读取一个字符,若getchar()后面还有getchar()那么会自动读取下一个字符,后面还有那就继续
所以while( ...getchar()..)就可以自动读完所有的字符,getchar()确实每次只读一个字符,但是你没让它停下:它只知道每次读一个字符,但并不知道读多少次。
如果你想要每次读一个字符就让你再次输入
你得换个算法或者函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 18:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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