15

我知道每个人都告诉我使用 fgets 而不是因为缓冲区溢出而得到。但是,我对fgets(). 据我了解, fgets 取决于:

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

char* str是将存储我的输入的 ptr。

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

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

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

4

4 回答 4

17

你是对的。 stream是一个指向FILE结构的指针,就像从fopen. stdin, stdout, 和stderr已经为您的程序定义,因此您可以直接使用它们,而不是自己打开或声明它们。

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

fgets(buffer, 10, stdin);

或来自特定文件:

FILE *f = fopen("filename.txt", "r");
fgets(buffer, 10, f);
于 2010-01-04T19:36:37.903 回答
4

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

于 2010-01-04T19:37:24.623 回答
3

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

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

tl;dr 是的,你应该stdinFILE* stream你的电话中使用fgets()

于 2010-01-04T19:41:39.593 回答
1

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

于 2010-01-04T19:36:48.823 回答