>> C言語入門トップに戻る

fgets 使い方、scanfとの違い

今回はfgets関数の使い方について説明します。

以下のコードを見てください。
#include <stdio.h>


int main(void){


	char test[10];

	puts("何か文字を入力して、エンターキーを押してください");

	fgets(test,10,stdin);

	puts("あなたは以下の文字を入力しました。");
	printf("%s",test);


	return 0;

}
これを実行して、キーボードで文字を入力してエンターを押すと入力した文字が表示されます。

fgetsの第一引数にはchar型のバッファ、第二引数は読み込むバイト数、
第三引数にファイルポインタや標準入力であるstdinなどを指定します。

fgets関数は文字入力を終了する際にエンターで確定するので、
最後に改行文字である「\n」が文字列の最後に入り、さらにバッファの末尾にヌル文字「\0」が入ります。
なので、testバッファを表示するときも改行されて表示されるわけです。
最後にヌル文字が入るので、バッファ一杯の10バイト分入力してしまうと、
最後の文字がヌル文字で上書きされることになります。
上記のコードを実行して、9バイト以上入力すると改行されないはずです。

似た関数でscanf関数がありますが、scanf関数はfgetsみたいにバイト数を指定しないので、
ユーザがバッファよりも長い文字列を入力してしまった場合はオーバーフローを起こして、
深刻なエラーが発生する可能性があります。
逆にfgets関数はバイト数を指定しているので、ユーザがそれよりも大きいバイト数の文字列を入力しても、
指定バイト数しか受け取らないのでエラーが発生しないというわけです。

それと最初の方で言ったようにfgetsはエンターで確定した際の改行コードも取得してしまいます。
scanfは改行コードを取得しません。

この二つがfgetsとscanf関数との大きな違いです。



>> C言語入門トップに戻る