web-dev-qa-db-ja.com

scanf()とfgets()の違い

fgets()scanf()の違いを知りたい。プラットフォームとしてCを使用しています。

33
Biswajyoti Das

複数の違いがあります。 2つの重要な要素は次のとおりです。

  • fgets()は開いているファイルから読み取ることができますが、scanf()は標準入力のみを読み取ります。
  • fgets()は、ファイルから「テキストの行」を読み取ります。 scanf()はそのために使用できますが、文字列から組み込み数値型への変換も処理します。

多くの人がfgets()を使用してデータ行を読み取り、次にsscanf()を使用して分析します。

24
int scanf(const char * restrict format, ...);

scanf(3)特定のパターンで検索されますパターン引数stdinとして知られる特定の入力で定義されます。パターンはユーザーが定義します。 scanf(3)への入力は、そのバリアント(scanf、fscanf、sscanf、vscanf、vsscanf、vfscanf)に応じて、文字列またはファイルになります。

char *fgets(char * restrict str, int size, FILE * restrict stream);

fgets(3)は、入力ファイルからlineを読み取りますstreamで、バイトをnull終了文字列としてバッファにコピーしますstrそして、バッファへの出力をsizeで指定されたバイトに制限します。

7
daniel

Scanfは境界チェックを実行しません。 fgetsがより良い選択になるでしょう。その後、sscanf()を使用して評価できます。

ここでトピックの良い議論- http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

scanfを使用してスペースを入力するにはどうすればよいですか? (これは私の邪魔な双子が、これを忘れてしまったために講義を受けます-私ではありません)

6
Kelly Gendron

scanfは読み込んだ(または作成した)文字列を解析し、fgetsは開いているFILE *から行を読み込みます。それともfscanfのことですか?

1
xcramps

scanfパターン仕様では、フィールド幅の制限が許可されていることに注意してください。

_scanf( " %80s", mybuffer );
_

ただし、printf()では、幅を変数として渡すことができます(「*」を使用):

_printf( "My name is %*s.\n", 20, name );
_

scanf()はサポートしていません。 (フィールドを完全に抑制/無視するためのフラグとして「*」を解釈します。)つまり、次のようなことをすることになります。

_#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );
_

scanf()のフィールド幅40をバッファ宣言のバッファ幅40に接続する方法はありません。

1
Joel Rees

主な違いは、scanfが(デフォルトの使用で)読み取れる文字数に制限がないという事実にありますが、fgetsには、読み取り可能な最大文字数が含まれています。

2つの関数のプロトタイプを参照してください。

char * fgets(char * dest、intサイズ、FILE * stream);

int scanf(const char * format、...);

fgetsの2番目のパラメーターは、最大でcharの読み取りを強制することがわかります。

もう1つの明らかな違いは戻り値です。fgets成功するとdestへのポインターを返します。 scanfは、正常に一致して割り当てられた入力項目の数を返します。次に、scanf関数はformatに従って入力をスキャンし、入力を読み取ります標準入力ストリームからstdinfgetsはデフォルトでFILE * streamから入力を読み取ります。

結論として、scanfを使用してFILEからデータを読み取り、固定サイズの配列(たとえば)に挿入することはあまり意味がありません。 scanfの利点は、出力データのフォーマットです。関数が12345\nを読み取る場合、出力は12345であり、fgetsは\n(含まれる)まで読み取り、戻り、\0文字列ターミネータとして最後に。

0
Kyrol