繁体   English   中英

fgets - 考虑 null 字符

[英]fgets - Take null character into account

当使用int scanf(const char *format, ...)扫描用户输入时,我会读取比字符串大小少一个字符,因为字符串的最后一个字符必须是null 字符\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);

C11 7.21.7.2 (强调我的):

  1. fgets function 最多读取比n [...] 指定的字符数少一个 null 字符在最后一个字符读入数组后立即写入。
  2. [如果发生错误] 返回一个 null 指针。

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

char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) /* all bets are off */;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM