パソコン活用研究シリコンバレー(C、C++、の活用研究)

入出力関数 (getchar getch putchar putch)

-------------------------------------------------------------------------------------
C言語には、ものすごくたくさんの関数が用意されています。(コンパイラによって差がありますが)
C言語習得(と偉そうなことをいってますが)にあたっては、この多種多様な関数をどれだけうまく
使いこなせるかが、ひとつのポイントになるでしょう。
実装されている関数の種類は、コンパイラによって異なりますし、同じ関数でも微妙に仕様が違う
場合がありますので、詳細の仕様はお持ちのコンパイラの仕様書、マニュアルで確認して下さい。
入出力関数としてまず基本中の基本である、キーボード入力、画面出力の関数についてとりあげます。
--------------------------------------------------------------------------------------

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);
}

TopPage