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