C语言:缓冲区大小,为什么当输入超过缓冲区大小时仍然有效?
C language: buffer size, why when input more than the buffer size still works?
问:为什么输入超过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 个字符之前有换行符,则最多读取并包括换行符),添加一个空字节,然后 returns。然后,您的打印代码将最多打印 11 个字符,而无需添加换行符或任何内容。因此,所有数据都被干净地读取和回显。
将您的 printf()
更改为 printf("[%s]\n", p);
,您会更清楚地看到它是如何工作的。
问:为什么输入超过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 个字符之前有换行符,则最多读取并包括换行符),添加一个空字节,然后 returns。然后,您的打印代码将最多打印 11 个字符,而无需添加换行符或任何内容。因此,所有数据都被干净地读取和回显。
将您的 printf()
更改为 printf("[%s]\n", p);
,您会更清楚地看到它是如何工作的。