【问题标题】:fgets() function in CC 中的 fgets() 函数
【发布时间】:2010-01-04 19:34:32
【问题描述】:

我知道每个人都告诉我使用 fgets 而不是因为缓冲区溢出而获取。但是,我对fgets() 中的第三个参数有点困惑。据我了解, fgets 依赖于:

char * fgets ( char * str, int num, FILE * stream );

char* str 是存储我的输入的指针。

num 是要读取的最大字符数。

但是FILE *stream 是什么?如果我只是提示用户输入一个字符串(比如一个句子),我应该输入“stdin”吗?

我应该在顶部main()附近输入FILE *stdin吗?

【问题讨论】:

    标签: c stdin fgets libc


    【解决方案1】:

    你是对的。 stream 是指向 FILE 结构的指针,就像从 fopen 返回的那样。 stdinstdoutstderr 已为您的程序定义,因此您可以直接使用它们,而不是自己打开或声明它们。

    例如,您可以使用以下命令从标准输入中读取:

    fgets(buffer, 10, stdin);
    

    或来自特定文件:

    FILE *f = fopen("filename.txt", "r");
    fgets(buffer, 10, f);
    

    【讨论】:

    • 我认为第二个参数应该是strlen(buffer) -1。除非你的缓冲区是 11 个字节。
    • @robUK,只有在缓冲区开始时不是全零的情况下才有效。正如 OP 所提到的,缓冲区溢出并不是问题的真正关注点。
    【解决方案2】:

    是的,您应该只使用stdin。这是一个预定义的FILE *,它从程序的标准输入中读取。如果文件顶部有 #include <stdio.h>fgets 需要它),则它应该已经定义。

    【讨论】:

      【解决方案3】:

      一般而言,您可以通过两种方式与 C 中的文件进行通信。一种是使用与文件描述符一起使用的低级操作系统相关系统调用,例如 open()read()write() 等。另一种是使用FILE 结构,这些结构用于C 库函数,如fread()fwrite() 等,包括您上面提到的那个。

      正如 UNIX 哲学一样,一切都是文件。因此,即使是标准输入 (stdin) 也被视为指向 FILE 结构的指针。

      tl;dr 是的,您应该在致电fgets() 时使用stdin 代替FILE* stream

      【讨论】:

        【解决方案4】:

        FILE 是标准的 C 文件。是的,如果你想从标准输入中读取,stdin 是正确的符号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-05
          • 1970-01-01
          相关资源
          最近更新 更多