関数は標準入力(コンソール画面)から文字を受け取ります。
- int getchar()
- 標準入力から文字を受け取る。
関数を実行すると、プログラムはユーザーからのキー入力待ちとなり一時停止状態となります。
ユーザーからの入力はバッファという一時保存領域に格納されます。
Enterキーを入力するとキー入力の終わりとなり、プログラムは再開しバッファから先頭の一文字を受け取ります。
読み取られなかった残りの文字はバッファに残ったままとなります。
なお、プログラムの開始直後はバッファは空の状態です。
このコードはユーザーにキー入力をさせ、先頭の一文字を表示します。
しかし何か文字を入力してEnterキーを押下した瞬間にプログラムは終了してしまいます。
最初の関数でキー入力をバッファに格納するのですが、プログラムに制御が返った後に変数に受け取るのは先頭の文字だけです。
残りの入力はバッファに残ったままですから、二回目の関数はキー入力待ちになることはなく、バッファから次の文字を受け取ります。
そのままプログラムは続行されるので、main関数の終端に達し、画面を確認する暇なくプログラムは終了してしまいます。
ループ文を使用して、改行文字()を受け取るまで関数を繰り返し実行しています。
キー入力の最後はEnterキーの入力ですから、改行文字を読み取ったらバッファにデータは残っていないということになります。
最後の関数の実行時はバッファは空なので、期待通りプログラムはキー入力待ちになり、もう一度Enterキーを押下すると終了します。
先頭の一文字だけを読み取り、残りのバッファを空にするサンプルです。
コード中にもコメントをしていますが、少しややこしいのは以下の箇所です。
代入式を評価すると、代入された値が返ります。
これを利用して、変数への代入と、代入した値との比較を一行で記述しています。
この処理は、何も文字を入力せずにEnterキーが押下された場合にループをやり直すためのものです。
バッファのクリア
これは単純に、改行文字が読み取られるまで関数を繰り返し実行しています。
while文にはループする処理となる「文」が必要ですが、セミコロン()がその文に該当します。
要するにこれは条件式が真でも何もしないwhile文ですが、条件式内の処理は式が成立している間は繰り返されるためこのような書き方ができます。
このループを抜けた後はバッファは空になっているので、再度関数を実行するとキー入力待ちになります。
先ほどは関数で入力された文字を読み取るとき、改行文字()をバッファの終端として使用していました。
しかし、バッファの終端には常に改行文字が存在するとは限りません。
標準入力はキーボード以外を指定することもできます。
例えばファイルを入力先として指定することもできるのですが、この場合改行文字はファイルの終端を示しているとは限りません。
入力の終端に達すると、関数はという定数を返す仕様になっています。
ただし通常のキー入力では、改行文字の次の文字を読み取ろうとするとキー入力待ちとなり、EOFを取得することはありません。
ではキーボード入力のみを想定したプログラムならばEOFは無視して良いかというと、そういうわけにも行きません。
キー入力時に、Windowsなら「Ctrl + Z」キー、Linuxなら「Ctrl + D」キーを押下するとEOFを入力することができます。
EOFを正しく処理するには以下の三つの関数を使用します。
関数は、正常にファイル終端に達した場合のほか、何らかの読み取りエラーが発生した時もEOFを返します。
関数はファイルが終端に達しているか否かを判定します。
-
int feof(
FILE *stream
); -
ファイルストリームstreamが終端に達している場合は0以外を返す。
それ以外の場合は0を返す。
関数は、ファイルストリームのエラーを判定します。
-
int ferror(
FILE *stream
); -
ファイルストリームstreamにエラーが発生している場合は0以外を返す。
それ以外の場合は0を返す。
関数は、ファイルストリームのエラー状態をリセットします。
-
void clearerr(
FILE *stream
); - ファイルストリームstreamにエラー状態をリセットする。
関数でエラーを検出した場合、自動で元の(エラーではない)状態には戻らないので、関数でエラーの状態を元に戻しておく必要があります。
先ほどのサンプルコード3を、EOFの入力に対応するように修正したサンプルコードです。
Windows環境とLinux環境とでは微妙に動作は異なりますが、EOFが入力された時にプログラムを終了するようにしています。
Windowsでは「Ctrl + Z」のみが入力された場合は関数はEOFを返しますが、二文字目以降に入力した場合は「26」という数値を返します。
これは無効な文字入力を示す置換文字(substitute character)というもので、これが入力されると入力の終端となり、バッファの残りの文字は切り捨てられるようです。
Enterキーの入力による改行文字も切り捨てられるため、と比較では入力の終端を検出できないので、26と比較して改行と同じ扱いにしています。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/3133.html