gets()函数和输入中的’\ 0’零字节

如果从文件读取零字节( '\0' ),来自C语言的gets()函数(例如来自glibc)是否会停止?

快速测试: echo -ne 'AB\0CDE'

谢谢。

PS这个问题来自这个问题的评论: 回归libc – 问题

PPS gets函数是危险的,但这是一个关于这个函数本身的问题,而不是关于任何人是否应该使用它。

gets()的行为是当遇到换行符或遇到EOF时它会停止。 它不关心它是否读取\0字节。

C99标准,7.19.7.7

概要

  #include  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)

该函数从流stdin读取字符直到下一个换行符,并将它们存储在字符串s中。 新行字符被丢弃(请注意,这与fgets的行为不同,后者将换行符复制到字符串中)。 如果遇到读取错误或文件结束,则返回空指针; 否则它返回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