1

当使用 扫描用户输入时int scanf(const char *format, ...),我会读取比字符串大小少一个字符,因为字符串的最后一个字符必须是空字符 \0

char str[10];
scanf("%9s", str); /* take \0 into account */

但是当我使用时char *fgets(char *str, int n, FILE *stream),我不知道我应该如何指定n。大多数在线教程都将其设置为sizeof(str),但有人告诉我应该是sizeof(str) - 1

那么如何防止缓冲区溢出呢?像这样:

char str[10];
fgets(str, 10, stdin);

或者我应该这样做:

char str[10];
fgets(str, 9, stdin);
4

1 回答 1

3

C11 7.21.7.2(强调我的):

  1. fgets函数最多读取的字符数比n[...] 指定的字符数少一个空字符,紧跟在读入数组的最后一个字符之后。
  2. [如果发生错误] 返回一个空指针。

因此,正确的用法是使用数组的完整大小检查返回值。

char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) /* all bets are off */;
于 2021-03-25T16:15:27.087 回答