永远不要使用gets!
7.19.7.2 fgets函数
概要
1 #include <stdio.h>
char *fgets(char * restrict s, int n,
FILE * restrict stream);
描述
2 fgets函数从stream指向的流中最多读取n-1个字符到s指向的数组中。在新行字符(保留该字符)或文件结尾之后不会再读取其他字符。一个空字符将立即写入数组中最后读取的字符之后。
返回值
3 如果成功,fgets函数返回s。如果遇到文件结尾并且没有将任何字符读入数组,则数组内容保持不变,并返回空指针。如果在操作过程中发生读取错误,则数组内容是不确定的,并返回空指针。
因此,是的,当fgets()
未返回NULL时,目标数组始终具有空字符。
如果fgets()
返回NULL,则目标数组可能已更改并且可能没有空字符。从fgets()
获取NULL后,永远不要依赖于数组。
编辑添加示例
$ cat fgets_error.c
#include <stdio.h>
void print_buf(char *buf, size_t len) {
int k;
printf("%02X", buf[0]);
for (k=1; k<len; k++) printf(" %02X", buf[k]);
}
int main(void) {
char buf[3] = {1, 1, 1};
char *r;
printf("输入CTRL+D:");
fflush(stdout);
r = fgets(buf, sizeof buf, stdin);
printf("\nfgets返回%p,buf具有[", (void*)r);
print_buf(buf, sizeof buf);
printf("]\n");
return 0;
}
$ ./a.out
输入CTRL+D:
fgets返回(nil),buf具有[01 01 01]
$
看到了吗?buf中没有空字符 :)
fgets()
的返回值:if (fgets(...) == NULL) /* 不确定的数组 */;
- pmgfgets()
返回NULL
,\0
也总是被附加的。 - Ree