1. 缓冲区的基本概念与分类
在C语言的标准I/O库中,缓冲区是介于程序与物理设备(如键盘、显示器)之间的临时存储区域。它就像快递公司的中转仓库,数据不会直接从发货方送到收货方,而是先在中转站暂存,达到一定规模后再统一配送。
1.1 全缓冲区的运作机制
全缓冲(fully buffered)是效率最高的缓冲方式,常见于文件操作。当缓冲区填满时才执行实际I/O操作。例如向文件写入数据时:
c复制FILE *fp = fopen("data.txt", "w");
for(int i=0; i<1000; i++) {
fprintf(fp, "Line %d\n", i); // 数据先存入缓冲区
}
fclose(fp); // 此时才真正写入磁盘
关键点:缓冲区大小通常为BUFSIZ(在多数系统中定义为8192字节),可通过setvbuf()函数自定义缓冲区大小。
1.2 行缓冲的典型场景
行缓冲(line buffered)是终端设备的默认模式,遇到换行符'\n'时刷新缓冲区。这是printf不会立即显示的原因:
c复制printf("Hello"); // 不会立即输出
sleep(3);
printf(" World\n"); // 此时"Hello World"一起显示
实测技巧:在调试时务必在printf末尾加\n,或手动调用fflush(stdout)立即输出。
1.3 无缓冲的特殊情况
无缓冲(unbuffered)模式常见于错误输出stderr,保证错误信息即时显示:
c复制fprintf(stderr, "Error: file not found\n"); // 立即输出
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. scanf的输入缓冲陷阱
2.1 回车符残留问题
当scanf读取数字后,输入缓冲区会残留'\n',导致后续gets()等函数出错:
c复制int age;
char name[20];
scanf("%d", &age); // 输入42[回车]
gets(name); // 直接读取到空字符串
解决方案:
- 使用
scanf("%d\n", &age)消耗换行符 - 清空缓冲区:`while(getcha
