如果从文件中读取零字节(),来自 C 语言的gets()
函数(例如来自 glibc)会停止'\0'
吗?
快速测试:echo -ne 'AB\0CDE'
谢谢。
PS这个问题来自这个问题的评论:return to libc - 问题
PPS 这个gets
功能很危险,但这是一个关于这个功能本身的问题,而不是关于是否有人使用它。
如果从文件中读取零字节(),来自 C 语言的gets()
函数(例如来自 glibc)会停止'\0'
吗?
快速测试:echo -ne 'AB\0CDE'
谢谢。
PS这个问题来自这个问题的评论:return to libc - 问题
PPS 这个gets
功能很危险,但这是一个关于这个功能本身的问题,而不是关于是否有人使用它。
的行为gets()
是在遇到换行符或遇到 EOF 时停止。它不关心它是否读取\0
字节。
C99 标准,7.19.7.7
概要
#include <stdio.h> char *gets(char *s);
描述
该
gets
函数从 stdin 指向的输入流中读取字符到 指向的数组中s
,直到遇到文件结尾或读取换行符。任何换行符都被丢弃,并且在读入数组的最后一个字符之后立即写入一个空字符。
来自 GNU libc 文档:http ://www.gnu.org/software/libc/manual/html_node/Line-Input.html#Line-Input
— 弃用的功能:
char * gets (char *s)
该函数
gets
从流 stdin 中读取字符直到下一个换行符,并将它们存储在字符串 s 中。换行符被丢弃(请注意,这与 fgets 的行为不同,后者将换行符复制到字符串中)。如果gets遇到读取错误或文件结束,则返回一个空指针;否则返回 s。
它不会在零字节处停止。
$ cat gets22.c
int main(int argc, char **argv) {
char array[8];
gets(array);
printf("%c%c%c%c%c%c%c\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
printf("%d %d %d %d %d %d %d\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
}
$ gcc gets22.c -o gets22
$ echo -ne 'AB\0CDE'| ./gets22
ABCDE
65 66 0 67 68 69 0