gpt4 book ai didi

c - fgets,其中读取的字符数大于存储大小

转载 作者:太空宇宙 更新时间:2023-11-04 05:48:53 26 4
gpt4 key购买 nike

我正在看一段代码来学习东西,我看到了这样的东西:

void funRead(){
char str[80];
FILE *fi;
fi = fopen("file","r");
while(!feof(fi)){
fgets(str, 200, fi);
// do things
}
fclose(fi);
}

而且有效! (这是一个相当大的代码)我不明白为什么它可以工作所以我试图重现它(只是这一部分,几乎只是上面的代码)并且我的程序崩溃了(我在 Eclipse )。它只在我写的时候起作用

fgets(str, 80, fi);

或另一个<80的数字,否则将不起作用。

我错过了什么吗?

EDIT :我正在谈论的程序部分的屏幕截图 https://gyazo.com/c8847ccc36bbbe7a406a3260db8dd358第 4 和 26 行

最佳答案

fgets(str, 200, fi); 确实是错误的,因为它告诉 fgets 往上读到 199 个字符,而实际上 str 最多可以存储 79 个字符(不是包括 '\0'-终止字节),这就是它“工作”1fgets(str, 80, fi); 的原因。

一般来说,像这样使用 sizeof 是个好主意2:

char str[80];
fgets(str, sizeof str, fi);

使用 sizeof 你会得到正确的大小,即使你后来决定改变str 的大小。

一件事是really wrong是:

while(!feof(fi))
{
...
}

代码应该做的是:

while(fgets(str, sizeof str, fi))
{
// do things
}

这是读取整个文件的正确方法。


注释

1我将作品放在引号中是因为代码检查何时停止的方式读数不正确。但是 fgets(str, 80, fi) 是正确的调用。

2请注意,只有当 str 是一个大批。如果它是一个指针并且你为它分配了内存,那么你不能使用sizeof,例如:

size_t len = 80;
char *str = malloc(len);
if(str == NULL)
{
// error handling
}

fgets(str, len, fi); // <-- do not use sizeof here, but the variable

关于c - fgets,其中读取的字符数大于存储大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49889730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com