第8章の1 getchar関数とputchar関数

1. printfとscanf以外の標準入出力関数

標準入力(キーボードからの入力)、標準出力(画面への出力)を行う標準ライブラリ関数には第5章で説明した printf() や scanf() の他にも、以下のように 1文字専用の入出力関数と 1行専用の入出力関数が用意されています。

  • 標準入力
    • getchar():標準入力から文字を入力する
    • fgets():指定したストリームから文字列を入力する(標準入力も指定可能)
    • scanf():標準入力から書式付きで入力する
  • 標準出力
    • putchar():標準出力へ文字を出力する
    • puts():標準出力へ文字列を出力する
    • printf():標準出力へ書式付きで出力する

標準入出力関数を使用するには、#include <stdio.h> が必要です。

2. getchar関数

キーボードから1文字入力します。

【書き方】
int c;      // 入力文字を格納する変数はint型
c = getchar();  // getcharが返した文字をcに代入する

// 例(getcharとscanfの比較)
#include <stdio.h>

int main(void)
{
    int ch1;
    char ch2;

    ch1 = getchar();        // どちらも一文字を入力します    
    scanf(" %c", &ch2);     //

    printf("ch1 = %c\n", ch1);
    printf("ch2 = %c\n", ch2);

    return 0;
}

【実行結果例】
a
b
ch1 = a
ch2 = b

水色文字はキーボードからの入力

getchar()でも scanf()と同様に復改が残る現象が起こります。

3. putchar関数

画面に 1文字出力します。

【書き方】
int c = ‘A’;    // 出力文字はint型
putchar(c);    // 文字’A’を出力する

// 例(putcharとprintfの比較)
#include <stdio.h>

int main(void)
{
    int ch = 'A';

    putchar(ch);        // どちらも一文字を出力します
    printf("%c", ch);   //

    return 0;
}

【実行結果例】
AA

4. getcharとputcharで繰り返し文字の入出力を行う

以下の例では、「Ctrl+Z」(UNIXの環境では「Ctrl+D」)が入力されるまで、1文字入出力を行います。

#include <stdio.h>

int main(void)
{
    int stg; 
    
    // 「EOF」 が返されるまで1文字入出力
    while ((stg = getchar()) != EOF) {    
        putchar(stg);
    }
    
    return 0;
}

【実行結果例】
A
A
B
B
C
C
^Z  ← 「Ctrl+Z」(UNIXの環境では「Ctrl+D」)を入力

水色文字はキーボードからの入力

【getchar()が何故 int型変数で受けるのか】
getchar()は入力が終了したときに上記のように「EOF」という値を返します。 この EOF は の中で宣言されているのですが、その値は通常は「-1」です。 普通 char型は「-128~127」の範囲を扱うのですが、0~255で文字コードを扱う処理系では「0~255」となり、この「-1」が扱えません。これに対し「int型」はどの処理系でも「-1」が扱えます。 ですから、どの処理系でも「EOF」が返せるように、getchar()は int型変数で値を受け取るのです。

〇 演習問題

  1. getchar() を用いて 1 文字入力を行い、Ctr+Z が入力されるまで次の処理を繰り返しなさい。
    大文字、小文字に関係なく、アルファベットを入力した場合には、それぞれの入力した個数を数えなさい。
  2. 1の処理終了後、アルファベットをそれぞれ何個ずつ入力したか出力しなさい。

※ 文字コードはASCIIとする。

(ヒント)

  • 入力アルファベットの個数を数えるカウンタは大きさ 26 の配列で用意。
  • 最初に、配列の 26個の要素すべてを0クリアすること。
  • A~Z、a~z は ASCIIコードの 65~90、97~122 に該当することを考えれば、 配列の何番目をカウントUP するかは計算で求められるはず。

【実行結果例】

文字を入力しなさい(終了条件:Ctrl+Z)
abcdef678ABCDEFopuKLH
ghtJK+ghjBBBdgjk
^Z
a :   2個入力		b :   5個入力		c :   2個入力		
d :   3個入力		e :   2個入力		f :   2個入力		
g :   3個入力		h :   3個入力		i :   0個入力		
j :   3個入力		k :   3個入力		l :   1個入力		
m :   0個入力		n :   0個入力		o :   1個入力		
p :   1個入力		q :   0個入力		r :   0個入力		
s :   0個入力		t :   1個入力		u :   1個入力		
v :   0個入力		w :   0個入力		x :   0個入力		
y :   0個入力		z :   0個入力		

水色文字はキーボードからの入力。
※ UNIXの環境では「Ctrl+D」)を入力してください。

コメント