永远不要使用gets!!
7.19.7.2 fgets 函数
概要
1 #include <stdio.h>
char *fgets(char * restrict s, int n,
文件 * 限制流);
描述
2 fgets函数读取最多比字符数少一个
由 n 指定的从流指向的流到指向的数组中
由 s. 换行符后不读取其他字符
(保留)或文件结束后。写入空字符
在最后一个字符读入数组后立即。
退货
3 如果成功,fgets 函数返回 s。如果遇到文件结尾
并且没有字符被读入数组,数组的内容
保持不变并返回一个空指针。如果发生读取错误
在操作过程中,数组内容是不确定的并且为空
返回指针。
所以,是的,当fgets()
不返回 NULL 时,目标数组总是有一个空字符。
如果fgets()
返回 NULL,则目标数组可能已更改并且可能没有空字符。从fgets()
.
添加了编辑示例
$ 猫 fgets_error.c
#include <stdio.h>
无效 print_buf(char *buf, size_t len) {
诠释 k;
printf("%02X", buf[0]);
for (k=1; k<len; k++) printf(" %02X", buf[k]);
}
诠释主要(无效){
字符 buf[3] = {1, 1, 1};
字符 *r;
printf("输入 CTRL+D:");
fflush(标准输出);
r = fgets(buf, sizeof buf, stdin);
printf("\nfgets 返回 %p, buf 有 [", (void*)r);
print_buf(buf, 大小的 buf);
printf("]\n");
返回0;
}
$ ./a.out
输入 CTRL+D:
fgets 返回 (nil), buf 有 [01 01 01]
$
看?buf 中没有 NUL :)