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

时间:2011-02-21 16:11:22

标签: c glibc libc gets

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

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

感谢。

PS此问题来自此问题中的评论:return to libc - problem

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

2 个答案:

答案 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