fgets()
と の違いを知りたいですscanf()
。プラットフォームとして C を使用しています。
6 に答える
複数の違いがあります。2つの重要なものは次のとおりです。
fgets()
開いているファイルから読み取ることができますが、scanf()
標準入力のみを読み取ります。fgets()
ファイルから「テキスト行」を読み取ります。scanf()
そのために使用できますが、文字列から組み込みの数値型への変換も処理します。
多くの人は、 を使用fgets()
して 1 行のデータを読み取り、 を使用sscanf()
してそれを分析します。
int scanf(const char * restrict format, ...);
scanf(3)は、 stdinとして知られる特定の入力のformat 引数によって定義された特定のパターンを検索します。ここで、パターンはユーザーによって定義されます。scanf(3)への指定された入力は、そのバリアント (scanf、fscanf、sscanf、vscanf、vsscanf、vfscanf) に応じて、文字列またはファイルになります。
char *fgets(char * restrict str, int size, FILE * restrict stream);
fgets(3)は、入力ファイルストリームから 1行を読み取り、バイトを null 終端文字列としてバッファーstrにコピーし、バッファーへの出力をsizeの指定されたバイトに制限します。
Scanf は境界チェックを実行しません。fgets がより良い選択になる可能性があります。その後、sscanf() を使用して評価できます。
ここでのトピックの良い議論 - http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html
scanf を使用してスペースを入力できるようにするにはどうすればよいですか? (それは私の邪悪な双子がこれを忘れたことで講義を受けていました-私ではありません)
scanf
パターン仕様ではフィールド幅の制限が許可されていることに注意してください。
scanf( " %80s", mybuffer );
ただし、printf()
幅を変数として渡すことができます(「*」を使用):
printf( "My name is %*s.\n", 20, name );
scanf()
ではない。(「*」をフラグとして解釈して、フィールドを完全に抑制/無視します。) つまり、次のようなことを行うことになります。
#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );
また、フィールド幅 40 をscanf()
バッファー宣言のバッファー幅 40 と接続する方法はありません。
主な違いは、scanf
(デフォルトの使用では)読み取ることができる文字数に制限がないのに対し、読み取ることができるfgets
文字の最大数があるという事実にあります。
2つの関数のプロトタイプを参照してください。
char * fgets(char * dest、int size、FILE * stream);
int scanf(const char * format、...);
fgets
の2番目のパラメーターは、最大でcharのサイズを読み取るように強制していることがわかります。
もう1つの明らかな違いは、戻り値です。成功fgets
した場合はポインタを返します。正常に一致および割り当てられた入力アイテムの数を返します。次に、scanf関数はフォーマットに従って入力をスキャンし、標準の入力ストリームstdinから入力を読み取りますが、デフォルトではFILE*ストリームからの入力を読み取ります。dest
scanf
fgets
結論として、FILEからデータを読み取り、それらを固定サイズの配列に挿入するために使用できますscanf
(たとえば)あまり意味がありません。の利点scanf
は、出力データのフォーマットです。関数がを読み取る12345\n
場合、出力はですが12345
、fgetsは読み取りを行い、till \n
(含まれる)を返し\0
、最後に文字列ターミネータとしてaを追加します。
scanf は、読み取った (または作成した) 文字列を解析し、fgets は、開いている FILE* から行を読み取ります。それともfscanfのことですか?