c - C语言:缓冲区大小,为什么当输入超过缓冲区大小时仍然有效?
问题描述
问题:为什么输入超过12个字符时,下面的程序仍然有效?谢谢。背景:我正在寻找一个需要读取无限数量字符并打印它们的功能的练习,我看到了这个解决方案(来自一个人的 gitbook)
#include <stdio.h>
#include <assert.h>
#define BUF_SIZE 12
void good_echo(void)
{
char buf[BUF_SIZE];
while(1) {
/* function fgets is interesting */
char* p = fgets(buf, BUF_SIZE, stdin);
if (p == NULL) {
break;
}
printf("%s", p);
}
return;
}
int main(void)
{
good_echo();
return 0;
}
解决方案
在fgets()
这种情况下,一次最多读取 11 个字符(如果在 11 个字符被填充之前有换行符,则最多读取并包括换行符),添加一个空字节,然后返回。然后,您的打印代码将打印最多 11 个字符,而无需添加换行符或任何内容。因此,所有数据都被干净地读取和回显。
改变你printf()
的printf("[%s]\n", p);
,你会更清楚地看到它是如何工作的。
推荐阅读
- javascript - 使用javascript重定向时如何找到重定向页面
- c - GtkApplication 的初始化——我应该使用 GObject 的“init”还是 GtkApplication 的“startup”?
- c# - 如何根据列表中的其他属性对列表进行排序
- matlab - MATLAB Mex C API 检查 mxarray 是否为基类
- reactjs - ReactJS,componentWillReceiveProps可以获取数据,但是render不能
- laravel - carregar múltiplos modelos em um 控制器
- actions-on-google - 智能家居 - 正确的 JSON 以在设备离线时响应 EXECUTE
- concourse - 如何测试大厅自定义资源类型?
- java - 我需要一些关于带有 hashmap 的用户类型的建议
- docker - 如何使用 docker-compose 从多个私有注册表中提取?