Loser_YiMo 发表于 2022-6-30 13:32:07

putchar,如何输出?

此问题出现在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()这个函数的性质到底是什么?它到底是如何做到这样输出的呢?

希望各位大神能帮鄙人一把!实在是想不明白了!各位新人也可以思考学习!

jackz007 发表于 2022-6-30 13:32:08

本帖最后由 jackz007 于 2022-6-30 15:16 编辑

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

人造人 发表于 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]
查看完整版本: putchar,如何输出?