鱼C论坛

 找回密码
 立即注册
查看: 1839|回复: 2

[已解决]putchar,如何输出?

[复制链接]
发表于 2022-6-30 13:32:07 | 显示全部楼层 |阅读模式
10鱼币
此问题出现在S1E13的动动手课后习题,将用户输入的英文句子进行大小写转换,代码如下:
#include <stdio.h>

int main()
{
        char i;
       
        while((i = getchar())!= '\n')
        {
                if(i >= 'A' && i <= 'Z')
                {
                        i = i + 32;
                        putchar(i);
                }
                else if(i >= 'a' && i <= 'z')
                {
                        i = i - 32;
                        putchar(i);
                }
                 
        }
       
        putchar('\n');

        return 0;
}


我并没有看答案写,所以写的时候非常疑惑,但是当我写完了看到和答案是一样的,我更疑惑了。
问题就出在putchar();

我是这样想的:比如我第一个字母输入T,这样while就会开始循环,并判断我输入的T字母是>= 'A' 并且 <= 'Z'的,所以把i加上32转换成了小写t,并把putchar(i);执行了一次,然后回到循环头准备检索第二个字母。。。
但是,这个putchar(i);执行后并没有着急输出t,而是循环整个结束后才一起输出,所以我非常迷惑,我以为程序会出现我输一个字母它就转换一个字母的情况,而这与我想得大相径庭!
我之前还想着要不要用字符串来存放我一个个输出的字符,结果一个putchar();就解决了?

故putchar()这个函数的性质到底是什么?它到底是如何做到这样输出的呢?

希望各位大神能帮鄙人一把!实在是想不明白了!各位新人也可以思考学习!
最佳答案
2022-6-30 13:32:08
本帖最后由 jackz007 于 2022-6-30 15:16 编辑

        你的感觉是对的,getchar() 是带缓冲的键盘输入,它并不能实时获取从键盘键入的每一个字符,打个比方,在按下回车键之前,即便是已经键入了10000 个以上的字符,getchar() 也不能读到其中的任何一个字符,这样,我们始终有机会修改其中任何一个字符,按下回车键后,getchar() 才开始陆续从键盘缓冲区中逐一获取键入的字符,直到读到回车字符 '\n' 为止。

最佳答案

查看完整内容

你的感觉是对的,getchar() 是带缓冲的键盘输入,它并不能实时获取从键盘键入的每一个字符,打个比方,在按下回车键之前,即便是已经键入了10000 个以上的字符,getchar() 也不能读到其中的任何一个字符,这样,我们始终有机会修改其中任何一个字符,按下回车键后,getchar() 才开始陆续从键盘缓冲区中逐一获取键入的字符,直到读到回车字符 '\n' 为止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-30 13:32:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-6-30 15:16 编辑

        你的感觉是对的,getchar() 是带缓冲的键盘输入,它并不能实时获取从键盘键入的每一个字符,打个比方,在按下回车键之前,即便是已经键入了10000 个以上的字符,getchar() 也不能读到其中的任何一个字符,这样,我们始终有机会修改其中任何一个字符,按下回车键后,getchar() 才开始陆续从键盘缓冲区中逐一获取键入的字符,直到读到回车字符 '\n' 为止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-30 15:32:56 | 显示全部楼层
putchar 默认是行缓冲的,就是遇到 '\n' 才输出
试试这个代码
#include <stdio.h>
#include <unistd.h>

int main(void) {
    setvbuf(stdout, NULL, _IONBF, 1024);
    for(size_t i = 0; i < 10; ++i) {
        putchar('0' + i);
        usleep(500000);
    }
    puts("");
    return 0;
}

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
Loser_YiMo + 3 + 3 + 3 谢谢!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 12:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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