【问题标题】:gets() function and '\0' zero byte in inputgets() 函数和输入中的 '\0' 零字节
【发布时间】:2011-07-01 09:30:26
【问题描述】:

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

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

谢谢。

PS这个问题出自cmets这个问题:return to libc - problem

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

【问题讨论】:

  • 请注意,您不应该使用getsstackoverflow.com/questions/1694036/…
  • @Jeremiah Willcock,当然,但是这个问题出现在一个最简单的堆栈溢出示例之后,它使用gets 来说明它的危险(参见链接的 Q)。

标签: c glibc libc gets


【解决方案1】:

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。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2021-11-23
      • 2016-12-20
      相关资源
      最近更新 更多