传递给 fgets 的正确长度

Dav*_*542 2 c arrays c-strings fgets char

如果我有以下缓冲区:

char buffy[40]; // includes \0 at the end
Run Code Online (Sandbox Code Playgroud)

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

char buffy[40];
while (fgets(buffy, 40, fp) != EOF)
    // ...
Run Code Online (Sandbox Code Playgroud)

M. *_*din 5

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

fgets(buf, sizeof buf, fp)
Run Code Online (Sandbox Code Playgroud)

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

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