バッファオーバーフローのために取得せずにfgetsを使用するように誰もが私に言ったことを知っています。ただし、fgets()
の3番目のパラメーターについて少し混乱しています。私が理解しているように、fgetsは以下に依存しています。
_char * fgets ( char * str, int num, FILE * stream );
_
_char* str
_は、入力が保存される場所へのptrです。
num
は、読み取られる最大文字数です。
しかし、_FILE *stream
_とは何ですか?ユーザーに文字列(文など)の入力を求めるだけの場合は、「stdin
」と入力するだけでよいですか?
そして、上部のmain()
の近くに_FILE *stdin
_と入力する必要がありますか?
あなたは正しいです。 stream
は、FILE
から返されるような、fopen
構造体へのポインタです。 stdin
、stdout
、およびstderr
はプログラムに対してすでに定義されているため、自分で開いたり宣言したりする代わりに、直接使用できます。
たとえば、次のように標準入力から読み取ることができます。
fgets(buffer, 10, stdin);
または、次の特定のファイルから:
FILE *f = fopen("filename.txt", "r");
fgets(buffer, 10, f);
はい、stdin
を使用する必要があります。これは、プログラムの標準入力から読み取る事前定義されたFILE *
です。また、ファイルの先頭に#include <stdio.h>
がある場合は、すでに定義されているはずです(fgets
に必要です)。
Cでファイルと通信するには、大きく分けて2つの方法があります。1つは、open()
、read()
、write()
などの低レベルのOS依存システムコールを使用する方法です。これはファイル記述子で機能します。もう1つは、上記のものを含むfread()
、fwrite()
などのCライブラリ関数で使用されるFILE
構造体を使用することです。
UNIX哲学と同様に、すべてがファイルです。したがって、標準入力(stdin
)でさえ、FILE
構造体へのポインターとして扱われます。
tl; drはい、fgets()
の呼び出しではFILE* stream
にstdin
を使用する必要があります
FILEは標準のCファイルです。はい、標準入力から読み取りたい場合は、 stdin が正しい記号です。