C 中的 fgets() 函数

发布于 2024-08-16 23:06:50 字数 398 浏览 8 评论 0原文

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

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

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

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

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

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

I know everybody has told me to use fgets and not gets because of buffer overflow. However, I am a bit confused about the third parameter in fgets(). As I understand it, fgets is dependent on:

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

char* str is the ptr to where my input will be stored.

num is the max number of character to be read.

but what is FILE *stream? If I am just prompting the user to enter a string (like a sentence) should I just type "stdin" ?

And should I type FILE *stdin at the top, near main()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不及他 2024-08-23 23:06:50

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

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

fgets(buffer, 10, stdin);

或者使用以下命令从特定文件中读取:

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

You are correct. stream is a pointer to a FILE structure, like that returned from fopen. stdin, stdout, and stderr are already defined for your program, so you can use them directly instead of opening or declaring them on your own.

For example, you can read from the standard input with:

fgets(buffer, 10, stdin);

Or from a specific file with:

FILE *f = fopen("filename.txt", "r");
fgets(buffer, 10, f);
提赋 2024-08-23 23:06:50

是的,您应该只使用 stdin。这是一个预定义的FILE *,它从程序的标准输入中读取。如果您的文件顶部有 #includefgets 需要它),那么它应该已经被定义。

Yes, you should just use stdin. That is a predefined FILE * that reads from the standard input of your program. And it should already be defined if you have a #include <stdio.h> at the top of your file (which you'll need for fgets).

你怎么这么可爱啊 2024-08-23 23:06:50

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

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

tl;dr 是的,您应该在调用 fgets() 时对 FILE* 流 使用 stdin

Broadly there are two ways you can communicate with files in C. One is using the low-level OS dependent system calls such as open(), read(), write() etc which work with file descriptors. Another one is using FILE structures which are used in C library functions like fread(), fwrite() etc including the one you mentioned above.

As it is with the UNIX philosophy, everything is a file. So even the standard input (stdin) is treated as a pointer to a FILE structure.

tl;dr Yes, you should use stdin for FILE* stream in your call to fgets()

作死小能手 2024-08-23 23:06:50

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

FILE is the standard C file. Yes, if you want to read from standard input, stdin is the correct symbol.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文