fgets和fgets_s
时间: 2023-10-15 12:29:07 浏览: 129
fgets_
`fgets` 和 `fgets_s` 都是用于从文件或标准输入流中读取字符串的函数。它们的功能相似,但 `fgets_s` 是 C11 标准中引入的更加安全的版本。
`fgets` 函数的原型如下:
```c
char *fgets(char *str, int n, FILE *stream);
```
它从指定的文件流 `stream` 中读取字符,最多读取 `n - 1` 个字符的数据,并将其存储到 `str` 中。读取操作会在读取到换行符、文件结束符或达到最大字符数时停止。`fgets` 会保留读取到的换行符,并在字符串末尾添加一个 null 字符。如果成功读取,返回值是 `str` 的地址,否则返回 NULL。
`fgets_s` 函数的原型如下:
```c
errno_t fgets_s(char *str, rsize_t n, FILE *stream);
```
它与 `fgets` 的用法类似,不同之处在于:它不会保留换行符并在字符串末尾添加 null 字符;而且它还提供了更好的安全性,避免了缓冲区溢出的风险。如果成功读取,返回值为零;否则,返回一个非零值表示错误。
需要注意的是,`fgets_s` 是 C11 标准中引入的函数,在某些平台上可能不被支持。为了兼容性,可以使用条件编译来选择使用 `fgets` 或 `fgets_s`。例如:
```c
#ifdef __STDC_LIB_EXT1__
fgets_s(str, sizeof(str), stdin);
#else
fgets(str, sizeof(str), stdin);
#endif
```
这样在支持 `fgets_s` 的平台上会使用 `fgets_s`,否则会使用 `fgets`。
阅读全文