C语言中的fgets()函数

16

我知道每个人都告诉我要使用fgets而不是gets,因为后者容易发生缓冲区溢出。然而,我对fgets()中的第三个参数有点困惑。就我所理解的,fgets依赖于:

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

char* str是指向存储输入的位置的指针。

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

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

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

4个回答

17

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

例如,您可以使用以下方式从标准输入读取:

fgets(buffer, 10, stdin);

或者从特定文件中获取:

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

1
我认为第二个参数应该是strlen(buffer) -1。除非你的缓冲区是11字节。 - ant2009
1
@robUK,如果缓冲区一开始不是全零,那么这种方法就行不通了。正如OP所提到的,缓冲区溢出并不是问题的关注点。 - Carl Norum

4

是的,你应该直接使用stdin。它是一个预定义的FILE *,用于读取程序的标准输入。如果你在文件顶部有一个#include <stdio.h>(你需要用到fgets),它应该已经被定义了。


3
大体上讲,C语言中有两种与文件通信的方式。一种是使用低级别的操作系统相关系统调用,如open()read()write()等,这些系统调用使用文件描述符。另一种方式是使用FILE结构,在C库函数中使用fread()fwrite()等函数,包括上面提到的。

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

简而言之,是的,您应该在调用fgets()时使用FILE* streamstdin


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接