fgets()
とscanf()
の違いを知りたい。プラットフォームとしてCを使用しています。
複数の違いがあります。 2つの重要な要素は次のとおりです。
fgets()
は開いているファイルから読み取ることができますが、scanf()
は標準入力のみを読み取ります。fgets()
は、ファイルから「テキストの行」を読み取ります。 scanf()
はそのために使用できますが、文字列から組み込み数値型への変換も処理します。多くの人がfgets()
を使用してデータ行を読み取り、次にsscanf()
を使用して分析します。
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で指定されたバイトに制限します。
Scanfは境界チェックを実行しません。 fgetsがより良い選択になるでしょう。その後、sscanf()を使用して評価できます。
ここでトピックの良い議論- http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html
scanfを使用してスペースを入力するにはどうすればよいですか? (これは私の邪魔な双子が、これを忘れてしまったために講義を受けます-私ではありません)
scanfは読み込んだ(または作成した)文字列を解析し、fgetsは開いているFILE *から行を読み込みます。それともfscanfのことですか?
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に接続する方法はありません。
主な違いは、scanf
が(デフォルトの使用で)読み取れる文字数に制限がないという事実にありますが、fgets
には、読み取り可能な最大文字数が含まれています。
2つの関数のプロトタイプを参照してください。
char * fgets(char * dest、intサイズ、FILE * stream);
int scanf(const char * format、...);
fgets
の2番目のパラメーターは、最大でcharの読み取りを強制することがわかります。
もう1つの明らかな違いは戻り値です。fgets
成功するとdest
へのポインターを返します。 scanf
は、正常に一致して割り当てられた入力項目の数を返します。次に、scanf関数はformatに従って入力をスキャンし、入力を読み取ります標準入力ストリームからstdin、fgets
はデフォルトでFILE * streamから入力を読み取ります。
結論として、scanf
を使用してFILEからデータを読み取り、固定サイズの配列(たとえば)に挿入することはあまり意味がありません。 scanf
の利点は、出力データのフォーマットです。関数が12345\n
を読み取る場合、出力は12345
であり、fgetsは\n
(含まれる)まで読み取り、戻り、\0
文字列ターミネータとして最後に。