如果从文件读取零字节(gets()
),来自C语言的'\0'
函数(例如来自glibc)是否会停止?
快速测试:echo -ne 'AB\0CDE'
感谢。
PS此问题来自此问题中的评论:return to libc - problem
PPS gets
函数是危险的,但它是关于此函数本身的问题,而不是任何人是否应该使用它。
答案 0 :(得分:2)
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的行为不同,fgets将换行符复制到字符串中)。如果遇到读错误或文件结束,则返回空指针;否则它会返回s。
答案 1 :(得分:1)
它不会在零字节处停止。
$ 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