C言語基礎|putchar関数

はじめに:putcharは「1文字だけ出したい!」を最短で叶える相棒

C言語で画面に何かを表示するとき、まず思い浮かぶのは printf かもしれません。
でも実際のプログラムでは、

  • 記号をずらっと並べたい。
  • 1文字ずつ整形しながら出したい。
  • 改行やタブなどの制御文字を確実に出したい。

みたいに、「1文字だけ」を何度も出したい場面がけっこうあります。
そんなときに気持ちよく使えるのが putchar関数 です。

サンプル:入力した回数だけ「!」を並べ、最後に改行する

「入力した回数だけ ! を並べて表示する」プログラムを例に解説をします。

プロジェクト名:chap4-9-1 ソースファイル名:chap4-9-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 読み込んだ整数の個数だけ ! を連続表示
#include <stdio.h>

int main(void)
{
    int n;

    printf("いくつ表示しますか:");
    scanf("%d", &n);

    while (n-- > 0)
        putchar('!');     // 1文字ずつ出力

    putchar('\n');        // 最後に改行
    return 0;
}

実行例

いくつ表示しますか:6
!!!!!!

いくつ表示しますか:0

いくつ表示しますか:-2

0 や負の数を入力すると、while文のループ本体が1回も実行されないので、結果的に改行だけが出ます。

putchar関数の役割と書式

putchar は 1文字を標準出力(通常は画面)に出力する関数です。

putcharの基本

項目内容
役割1文字を標準出力へ出す
書式putchar(文字);
必要なヘッダstdio.h
戻り値成功時:出力した文字(int)/失敗時:EOF

使い方はシンプルで、かっこの中に「出したい文字」を渡します。

putchar('A');   // A を1文字表示
putchar('\n');  // 改行を1文字表示

文字を渡すときの注意:putcharに渡すのは文字定数

putchar に渡すのは 1文字です。
つまり、シングルクォートで囲んだ 文字定数 を渡します。

正しい例と誤り例

コード結果理由
putchar('A');正しい1文字(文字定数)
putchar("A");誤り文字列(複数文字の並び)
printf("A");正しいprintf は文字列を扱う
printf('A');誤りprintf は文字列が必要

この違いはめちゃくちゃ大事です。
見た目は似ているけど、'A'"A" は別物です。

文字定数と文字列リテラルの違い

'A' と "A" のイメージ

'A'  -> a single character (character constant)
"A"  -> a string (string literal) that contains characters

表:'a' と "a" の違い

書き方呼び名中身代表的な用途
'a'文字定数1文字putchar、1文字比較
"a"文字列リテラル文字の並びprintf、puts

サンプルの流れ:whileで回数分だけ1文字を積み上げる

今回のサンプルは、次の2段構えです。

  1. while文で ! を n 回出す。
  2. 最後に改行 \n を1回出す。

プログラムの流れ

n を入力
   ↓
n が 0 より大きい間は繰り返す
  ├ putchar('!') を実行
  └ n を 1 減らす
   ↓
putchar('\n') で改行
   ↓
終了

n が 3 のときの変化(n-- > 0)

判定回判定に使う nn > 0 ?ループ本体判定直後の n
13! を出す2
22! を出す1
31! を出す0
40実行しない-1

「表示は3回」で、終了時の n は -1 になっている点がポイントです。

do文とwhile文:ループ本体が1回も実行されないことがある

サンプルでは 0 や負の値を入力すると、ループ本体が素通りされます。
これは while文が前判定だからです。

do文とwhile文の違い

種類判定のタイミングループ本体
do文後で判定(後判定繰返し)少なくとも1回は実行される。
while文先に判定(前判定繰返し)1回も実行されないことがある。

つまり、

  • 必ず1回は処理したい → do文が向きやすい。
  • 条件を満たすときだけ処理したい → while文が向きやすい。

という使い分けになります。

まとめ:putcharを使えると出力の自由度が上がる

  • putchar は 1文字だけ出力する関数
  • putchar に渡すのは文字定数('A' の形)
  • "A" は文字列なので putchar には渡せない。
  • while文と組み合わせると「記号を回数分並べる」がきれいに書ける。
  • while文は前判定なので、条件によってはループ本体が1回も実行されない。