传递给fgets的正确长度

如果我有以下缓冲区:

char buffy[40]; // includes  at the end

fgets函数应该是STLEN40 还是 39?为什么?

char buffy[40];
while (fgets(buffy, 40, fp) != EOF)
    // ...

回答

fgets读入的字符数最多比其第二个参数的值少 1。所以在这种情况下,正确的值应该是 40。它将最多读取 39 个字符,数组的最后一个元素将用于存储 ''。这确保不会发生缓冲区溢出。作为成语

fgets(buf, sizeof buf, fp)

当(且仅当)数组 的声明buf可见时才可以使用。

请注意,将其称为 没有任何问题fgets(buf, 39, fp),但这将导致它最多读取 38 个字符,并且将存储 '' buf[38](如果已读取 38 个字符)。buf[39]根本不会使用数组 ( )的最后一个元素。


以上是传递给fgets的正确长度的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>