>> C言語入門トップに戻る
今回はfgets関数の使い方について説明します。
以下のコードを見てください。
fgetsの第一引数にはchar型のバッファ、第二引数は読み込むバイト数、
第三引数にファイルポインタや標準入力であるstdinなどを指定します。
fgets関数は文字入力を終了する際にエンターで確定するので、
最後に改行文字である「\n」が文字列の最後に入り、さらにバッファの末尾にヌル文字「\0」が入ります。
なので、testバッファを表示するときも改行されて表示されるわけです。
最後にヌル文字が入るので、バッファ一杯の10バイト分入力してしまうと、
最後の文字がヌル文字で上書きされることになります。
上記のコードを実行して、9バイト以上入力すると改行されないはずです。
似た関数でscanf関数がありますが、scanf関数はfgetsみたいにバイト数を指定しないので、
ユーザがバッファよりも長い文字列を入力してしまった場合はオーバーフローを起こして、
深刻なエラーが発生する可能性があります。
逆にfgets関数はバイト数を指定しているので、ユーザがそれよりも大きいバイト数の文字列を入力しても、
指定バイト数しか受け取らないのでエラーが発生しないというわけです。
それと最初の方で言ったようにfgetsはエンターで確定した際の改行コードも取得してしまいます。
scanfは改行コードを取得しません。
この二つがfgetsとscanf関数との大きな違いです。
>> C言語入門トップに戻る
fgets 使い方、scanfとの違い
以下のコードを見てください。
#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言語入門トップに戻る