4

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

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

谢谢。

PS这个问题来自这个问题的评论:return to libc - 问题

PPS 这个gets功能很危险,但这是一个关于这个功能本身的问题,而不是关于是否有人使用它。

4

2 回答 2

5

的行为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。

于 2011-02-21T16:27:18.583 回答
2

它不会在零字节处停止。

$ 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
于 2011-02-21T16:12:13.430 回答