关于while语句的问题。

新手上路,请多包涵

想知道while语句的具体运行方式
比如

#include<stdio.h>
int main(){
char a;
int n=0;
scanf("%c",&a);
while(a!='\n'){
if(a<='z'&&a>='a'){
a=a-32;
}
if(a=='A'||a=='E'||a=='I'||a=='O'||a=='U'){
n++;
}
printf("%c",a);
scanf("%c",&a);
}
printf("\n%d",n);
return 0;
}

为什么在输入字母后不会立即执行print,而是在输入\n后一起执行print
不会出现输入一个字母就立刻输出一个字母,而是在输入完所有字母后输出类似字符串的效果?

阅读 1.1k
1 个回答

结论

该现象与printf的缓冲区有关。printf是将字符串格式化输出到标准输出,其是带有行缓冲的。如问题中前面输入的字母将暂存到缓冲区,直到遇到换行符时才刷新缓冲区,输出到屏幕。

行缓冲

引入缓冲的目的

  • 设备与CPU速度不对等,数据先输出到缓冲区可以减少CPU等待IO的时间浪费;
  • 尽可能减少read/write系统调用次数

行缓冲区刷新条件

  • 进程结束
  • 遇到换行符,即\n
  • 缓冲区满
  • 调用flush刷新缓冲区
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进