首页 > 解决方案 > 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;
}

标签: cbuffer

解决方案


fgets()这种情况下,一次最多读取 11 个字符(如果在 11 个字符被填充之前有换行符,则最多读取并包括换行符),添加一个空字节,然后返回。然后,您的打印代码将打印最多 11 个字符,而无需添加换行符或任何内容。因此,所有数据都被干净地读取和回显。

改变你printf()printf("[%s]\n", p);,你会更清楚地看到它是如何工作的。


推荐阅读