web-dev-qa-db-ja.com

Cのfgets()関数

バッファオーバーフローのために取得せずにfgetsを使用するように誰もが私に言ったことを知っています。ただし、fgets()の3番目のパラメーターについて少し混乱しています。私が理解しているように、fgetsは以下に依存しています。

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

_char* str_は、入力が保存される場所へのptrです。

numは、読み取られる最大文字数です。

しかし、_FILE *stream_とは何ですか?ユーザーに文字列(文など)の入力を求めるだけの場合は、「stdin」と入力するだけでよいですか?

そして、上部のmain()の近くに_FILE *stdin_と入力する必要がありますか?

13
emily

あなたは正しいです。 streamは、FILEから返されるような、fopen構造体へのポインタです。 stdinstdout、およびstderrはプログラムに対してすでに定義されているため、自分で開いたり宣言したりする代わりに、直接使用できます。

たとえば、次のように標準入力から読み取ることができます。

fgets(buffer, 10, stdin);

または、次の特定のファイルから:

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

はい、stdinを使用する必要があります。これは、プログラムの標準入力から読み取る事前定義されたFILE *です。また、ファイルの先頭に#include <stdio.h>がある場合は、すでに定義されているはずです(fgetsに必要です)。

4
Brian Campbell

Cでファイルと通信するには、大きく分けて2つの方法があります。1つは、open()read()write()などの低レベルのOS依存システムコールを使用する方法です。これはファイル記述子で機能します。もう1つは、上記のものを含むfread()fwrite()などのCライブラリ関数で使用されるFILE構造体を使用することです。

UNIX哲学と同様に、すべてがファイルです。したがって、標準入力(stdin)でさえ、FILE構造体へのポインターとして扱われます。

tl; drはい、fgets()の呼び出しではFILE* streamstdinを使用する必要があります

3
user108127

FILEは標準のCファイルです。はい、標準入力から読み取りたい場合は、 stdin が正しい記号です。

1
David Nehme