传递给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]根本不会使用数组 ( )的最后一个元素。