入出力関数 (getchar getch putchar
putch)
-------------------------------------------------------------------------------------
C言語には、ものすごくたくさんの関数が用意されています。(コンパイラによって差がありますが)
C言語習得(と偉そうなことをいってますが)にあたっては、この多種多様な関数をどれだけうまく
使いこなせるかが、ひとつのポイントになるでしょう。
実装されている関数の種類は、コンパイラによって異なりますし、同じ関数でも微妙に仕様が違う
場合がありますので、詳細の仕様はお持ちのコンパイラの仕様書、マニュアルで確認して下さい。
入出力関数としてまず基本中の基本である、キーボード入力、画面出力の関数についてとりあげます。
--------------------------------------------------------------------------------------
標準入出力(キーボードからの入力、ディスプレイへの表示)に使うprintf,scanfについては以下のページを
ご参照下さい。
画面出力(printf)
&キーボード入力(scanf)& 変数
Printfと変数の型
標準入力scanfの使用上の注意(scanfの魔界)
標準入力scanfとgetsの小技(魔界からの脱出)
1 キーボード入力 (getchar, getch)
キーボード入力関数として、たいていのC言語でgetchar,
getch の2種類が用意されています。
どちらも、キーボードから1文字を読み込み、その結果を返す関数ですが、若干機能が異なります。
getchar
書式 #include <stdio.h> int getchar() 機能 標準入力(キーボード)から1文字読み込み、その文字を返します(戻り値は整数型) エンドオブファイル、またはエラーの場合はEOF (-1) を返します |
キーボードから入力した文字は画面上にエコーバック(表示)されます。
Enterキーをおすと、実際にgetcharにより1文字づつ読み込まれます。
Basicのinput
に似ていますが、1文字だけを読み込む点が異なります。
例えば、以下のような、キーボードから入力した文字を配列に1文字づつ格納するプログラムは
C言語では以下のようになります。
int a, b[10];
i = 1;
while ((a = getchar()) != EOF) {
b[i] = a;
i++; }
Basicで記述すると以下のようです。
10 dim b$(10)
10 input a$
20 for i = 1 to len(a$)
30 b$(i) = mid$(a$, i, 1)
40 next
getch
書式 #include <conio.h> int getch() 機能 キーボードからエコーバックなしで1文字読み込み、読み込んだ文字を返します(戻り値は整数型) |
getchar
と違い、キーボードから入力した文字を画面にエコーバックしません。
また、キーを押すとその文字を即取り込みます。
Basicのinput$(1) に似た機能です。
getchによるリアルタイムキー入力
さて、getch
もキーが押されるまでは、キー入力待ちの状態で待機し続けます。従って、Basicのinkey$のような
リアルタイムキー入力には使えません。残念ながらC言語にはBasicのinkey$に当たる機能の関数がありません。
従って、リアルタイムキー入力はgetchを使って以下のように記述するのが一般的です。
if (kbhit()) c = getch();
kbhit はキー入力があったかどうかを判定する関数です。
こう記述すれば、キー入力のあった時だけ、getchで入力されたキーを取得しに行くことができます。
リアルタイムキー入力については
CHASEの作成
もぐらたたきの作成
にも説明がありますので、参照して下さい。
2 putchar, putch
putchar, putch
は画面に1文字出力(表示)する関数で、機能は同じと考えていいと思います。
使い方は簡単なので、以下の使用例を参照して下さい
putchar
書式 #include <stdio.h> int putchar(int) 機能 画面に1文字出力します。戻り値は正常終了なら0。エラーならEOFです。 |
putch
書式 #include <conio.h> int putch(int) 機能 画面に1文字出力します。戻り値は正常終了なら0。エラーならEOFです。 |
3 使用例
使用例として、getchar, getch
の違いのわかる簡単なサンプルをあげます。
/* getchar.c */ # include <stdio.h> int c, cc; main(){ printf ("getcharの実験 Ctrl + Z で終了\n"); while ((c=getchar())!=-1) {putchar('*'); putchar(c);} printf ("getchの実験 スペースキーで終了\n"); while ((cc=getch())!=32) {putchar('*'); putchar(cc);} } |
実行例です。getchar
はキーボードからの入力を画面にエコーバックし、リターンキーが押されてから
1文字づつ取り込みます。一方getchはキーが押されるとエコーバックせずに、キーを即取り込みます。
C:\C>getchar getcharの実験 Ctrl + Z で終了 abcdef *a*b*c*d*e*f* ^Z getchの実験 スペースキーで終了 *a*b*c*d*e*f C:\C> |
また、今までgetcharはキーボード入力 putcharは画面への出力という言い方をしてきましたが
正確に言うとgetcharは標準入力(デフォルトはキーボード)からの入力、putcharは標準出力(デフォルト
は画面)への出力になります。
従って、以下の(超簡単)プログラム(ファイル名kcopy.exe)は、リダイレクトを使うとコピーコマンドと
同じような使い方ができます。以下の様にコマンドをタイプすれば、kcopy.c
をcopy.txt にコピーします。
C:\C>kcopy <kcopy.c >copy.txt
# include <stdio.h> int c; main(){ while((c=getchar())!=-1) putchar(c); } |