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