C言語のきほん|C言語の標準入出力関数

文字を受け取り、画面に伝える。標準入出力関数を知ると、C言語の基本がしっかり身につく

C言語でプログラムを書くとき、まず最初に必要になるのが「入力」と「出力」です。
たとえば、キーボードから文字や数値を受け取ったり、画面に結果を表示したりする処理ですね。こうしたやり取りができるようになると、プログラムはただ計算するだけのものではなく、ユーザーとやり取りできるものになっていきます。

これまでにも printf や scanf を使って、画面への表示やキーボードからの入力を行ってきたと思います。
でも、C言語の標準入出力関数には、それ以外にも便利なものがいろいろあります。

たとえば、

  • 1文字だけ入力する getchar
  • 1文字だけ出力する putchar
  • 1行の文字列を読み込む fgets
  • 文字列を表示する puts

といった関数があります。

これらの関数を使い分けられるようになると、プログラムの目的に応じて、より自然でわかりやすいコードが書けるようになります。
毎回 printf と scanf だけに頼るのではなく、「今は1文字だけ扱いたい」「今は文字列全体を安全に読み込みたい」といった場面で適切な関数を選べるようになることが大切です。

また、これらの関数はすべて、C言語の標準入出力を扱う仕組みの上に成り立っています。
入力は標準入力、出力は標準出力という形で扱われ、C言語ではそれらを関数を通じて操作していきます。

このあたりのしくみを理解しておくと、単に関数の使い方を覚えるだけでなく、C言語がどのように外の世界とやり取りしているのかも見えてきます。

ここでは、標準入出力関数とは何かをはじめとして、getchar と putchar を中心に、1文字の入出力、EOF の考え方、繰り返し入力の書き方、バッファリングの基本まで、ていねいに見ていきましょう。

標準入出力関数とは

標準入出力関数とは、キーボードからデータを受け取ったり、画面にデータを表示したりするための関数です。
C言語では、このような基本的な入出力のために、あらかじめ便利な関数が用意されています。

標準入出力関数の役割を整理すると、次のようになります。

役割内容
標準入力からデータを受け取るキーボードから文字や数値を入力する
標準出力へデータを送る画面に文字や数値を表示する

ここでいう標準入力は通常キーボード、標準出力は通常ディスプレイ画面を指します。
学習の最初はこの理解で大丈夫です。

代表的な標準入出力関数には、次のようなものがあります。

関数名役割
getchar標準入力から1文字入力する
putchar標準出力へ1文字出力する
fgets文字列を入力する
puts文字列を出力する
scanf書式付きで入力する
printf書式付きで出力する

これらの関数を使うには、次のヘッダファイルをインクルードします。

#include <stdio.h>

stdio.h は、標準入出力を扱うためのヘッダファイルです。
printf や scanf だけでなく、getchar、putchar、fgets、puts などもこのヘッダファイルに関係しています。

標準入力と標準出力をイメージしよう

最初は、標準入力と標準出力という言葉が少し堅く感じるかもしれません。
でも、考え方はそれほど難しくありません。

  • 標準入力は、プログラムに入ってくるデータの入口
  • 標準出力は、プログラムから出ていくデータの出口

というイメージです。

たとえば、キーボードで A を入力すると、その文字が標準入力を通ってプログラムに渡されます。
そして、putchar で A を表示すると、その文字が標準出力を通って画面に表示されます。

この図では、キーボードから入力された文字が標準入力を通ってCプログラムに入り、その結果が標準出力を通ってディスプレイへ表示される流れを表しています。
こうして見ると、入力関数と出力関数は、プログラムの入口と出口を担当していることがわかりやすくなります。

getchar 関数とは

getchar は、標準入力から1文字を読み取る関数です。
たとえば、キーボードで A を入力すれば、その A を読み取って返します。

関数宣言は次の通りです。

int getchar(void);

この宣言から読み取れることを整理すると、次のようになります。

項目内容
関数名getchar
引数なし
返却値int 型
機能標準入力から1文字を読み取る

なぜ返却値が int 型なのか

ここはとても大切なポイントです。
getchar は「1文字を読む関数」なので、char 型を返しそうに見えますよね。ですが、実際には int 型です。

その理由は、文字そのものだけでなく、EOF も返す必要があるからです。

EOF は、ファイル終端や入力の終わり、またはエラーを表す特別な値です。
通常は -1 として扱われることが多いですが、これは「普通の文字とは別の特別な値」と考えるとよいです。

もし getchar の返却値を char 型で受け取ると、環境によっては EOF を正しく扱えない可能性があります。
そのため、getchar の返却値は int 型で受け取るのが基本です。

使用例

int ch;

ch = getchar();

このように、getchar が返した値を int 型の変数に代入して使います。

putchar 関数とは

putchar は、引数で指定した1文字を標準出力へ表示する関数です。
たとえば、文字 A を渡すと、その A が画面に表示されます。

関数宣言は次の通りです。

int putchar(int c);

これも整理すると、次のようになります。

項目内容
関数名putchar
引数int 型の文字データ
返却値int 型
機能標準出力へ1文字を書き込む

使用例は次の通りです。

putchar('B');

これで、画面に B が表示されます。

putchar も返却値は int 型です。
正常なら出力した文字を返し、エラー時には EOF を返します。

関数宣言の読み方も確認しておこう

標準ライブラリ関数を学ぶときは、関数宣言の読み方に慣れておくことも大切です。
たとえば、

int getchar(void);

という宣言は、次の意味を持っています。

要素意味
int戻り値の型
getchar関数名
void引数がないことを表す

同じように、

int putchar(int c);

は、

要素意味
int戻り値の型
putchar関数名
int cint 型の引数を1つ受け取る

という意味です。

関数宣言が読めるようになると、「この関数は何を受け取って、何を返すのか」が見えるようになります。
これは今後、標準ライブラリ関数を学び進めるうえでとても役立ちます。

1文字の入出力を行うシンプルなプログラム例

入力した1文字の前にメッセージを付けて表示するプログラムです。

ファイル名:12_3_1.c

#include <stdio.h>

int main(void)
{
    int ch;

    /* 1文字入力する */
    ch = getchar();

    /* 案内メッセージを表示する */
    printf("入力された文字は ");
    
    /* 入力された1文字を表示する */
    putchar(ch);

    /* 改行する */
    putchar('\n');

    return 0;
}

このプログラムの流れ

このプログラムは、次の順番で動きます。

順番処理内容
1getchar で1文字入力する
2printf で説明文を表示する
3putchar で入力された文字を表示する
4putchar で改行する

たとえば、H を入力すると、画面には次のように表示されます。

H
入力された文字は H

ここでは putchar だけでなく printf も組み合わせていますが、「1文字を受け取り、それをそのまま出力する」という中心部分は getchar と putchar が担当しています。

入力した文字をそのまま表示するしくみ

getchar と putchar の組み合わせは、とてもシンプルですが大切です。
この2つを使うと、「入力した文字をそのまま返す」という基本的な処理が書けます。

流れで書くと、次のようになります。

  1. getchar がキーボードから1文字受け取る
  2. 受け取った値を変数に入れる
  3. putchar がその値を画面に表示する

このように、C言語では文字の入出力を関数の組み合わせで実現していきます。

1文字の入出力を繰り返すプログラム

次に、入力が終わるまで1文字ずつ読み込み、表示し続ける例を見てみましょう。
元の内容をもとにしつつ、コメントを日本語に整えたシンプルな形にしています。

ファイル名:12_3_2.c

#include <stdio.h>

int main(void)
{
    int ch;

    /* EOF が入力されるまで繰り返す */
    while ((ch = getchar()) != EOF) {
        putchar(ch);
    }

    return 0;
}

このプログラムは、入力された文字をそのまま順番に表示し続けます。
終了したいときは EOF を入力します。

実行イメージ

たとえば、次のように入力したとします。

abc

すると、そのまま

abc

と表示されます。

実際には、キーボードから入力した内容がそのままエコー表示される環境もあるため、見え方は実行環境によって少し印象が変わることがあります。
ただし、プログラムの動きとしては「1文字ずつ読み取り、1文字ずつ表示している」と考えて大丈夫です。

while ((ch = getchar()) != EOF) の意味

この書き方は、最初は少し難しく見えるかもしれません。
でも、順番に分けて考えるとわかりやすいです。

while ((ch = getchar()) != EOF)

は、次のような流れになっています。

手順内容
1getchar で1文字読み取る
2その値を ch に代入する
3ch が EOF ではないか調べる
4EOF でなければ繰り返し続ける

つまり、読み取る、代入する、終わりかどうか確かめるを1行で書いているのです。

かっこが必要な理由

ここでは、

(ch = getchar())

の部分にかっこが付いています。
これはとても大切です。

もし、かっこを付けずに書くと、代入よりも != の評価順序が問題になり、意図した動きにならないことがあります。
そのため、getchar の結果をまず ch に代入してから EOF と比較することを明確にするために、かっこを付けています。

EOF とは何か

EOF は End Of File の略で、入力の終わりを表す特別な値です。
学習の初期では、「これ以上入力がないことを示す印」と考えるとわかりやすいです。

getchar は通常、読み取った文字を返します。
でも、入力の終わりに達したり、エラーが起きたりすると EOF を返します。

このため、繰り返し入力を行うプログラムでは、EOF が非常に重要になります。

意味
普通の文字実際に入力された文字
EOF入力の終わり、またはエラー

EOF の入力方法

一般的には、次のように入力します。

環境EOF の入力方法
WindowsCtrl + Z のあと Enter
UNIX / LinuxCtrl + D

環境によって少し違いがあるので、その点は覚えておくと便利です。

バッファリングとは何か

getchar は1文字ずつ入力する関数です。
でも実際に使ってみると、キーを1回押した瞬間にすぐプログラムへ渡されるようには見えず、Enter を押してからまとめて処理されるように感じることがあります。

これは、バッファリングという仕組みがあるためです。

バッファリングとは、入力をいったん作業用の領域にためておき、あるタイミングでまとめてプログラムへ渡す仕組みです。
標準入力では、通常 Enter キーが押されたタイミングで入力が確定し、プログラム側に渡されます。

バッファリングの流れ

段階内容
1キーボードで文字を入力する
2入力内容がバッファにたまる
3Enter を押す
4まとめてプログラムへ渡される

このため、getchar は1文字ずつ取り出していても、入力そのものはバッファを通してまとめて渡されることがあります。

この図では、キーボードから入力された文字がいったんバッファにためられ、Enter が押されたあとでプログラムへ渡される流れを表しています。
このイメージを持っておくと、「getchar は1文字ずつ読むのに、なぜ Enter まで待つのか」が理解しやすくなります。

getchar と putchar を学ぶ意味

getchar と putchar は、とても基本的な関数です。
機能としてはシンプルですが、この2つを学ぶことで、C言語の入出力の考え方がよく見えてきます。

特に大事なのは、次の点です。

学べること内容
文字単位の入出力1文字ずつ処理する基本がわかる
戻り値の扱いgetchar の戻り値を int で受ける意味がわかる
EOF 判定入力の終わりをどう扱うかがわかる
繰り返し処理との組み合わせwhile と組み合わせた基本形が身につく
バッファリングの理解入力がどう渡されるかの感覚がつかめる

このように、getchar と putchar は単なる1文字入出力の関数ではなく、C言語の入出力全体を理解するための入口にもなっています。

printf や scanf との違いも意識しよう

ここまで見てきた getchar と putchar は、1文字だけを扱う関数です。
一方で、printf や scanf は書式を使って、数値や文字列などをまとめて扱うことができます。

その違いを簡単に整理すると、次のようになります。

関数特徴
getchar1文字入力に向いている
putchar1文字出力に向いている
scanf書式付きで入力できる
printf書式付きで出力できる
fgets1行の文字列入力に向いている
puts文字列出力に向いている

つまり、標準入出力関数はそれぞれ得意分野が違います。
処理したい内容に応じて、適切な関数を選ぶことが大切です。

標準入出力関数を使うときの基本姿勢

標準入出力関数は、C言語のプログラムでとてもよく使います。
そのため、関数名だけ覚えるのではなく、次のような点を意識して使うことが大切です。

  • どのヘッダファイルが必要か
  • 何を入力し、何を返す関数か
  • 1文字向きか、文字列向きか
  • EOF や改行の扱いはどうなるか
  • 実行環境での入力の見え方はどうか

こうした点を少しずつ意識していくと、ただ動くコードを書く段階から、しくみを理解して使える段階へ進んでいけます。

C言語の標準入出力関数は、これから先のプログラム作成でも何度も登場します。
まずは getchar と putchar のような基本的な関数を通して、入力と出力の流れをしっかりつかんでいきましょう。