C言語基礎|文字定数とputchar関数の使い方

はじめに:1文字ずつ出すと、プログラムが「手触りよく」なる

printf って便利なんですが、実は「1文字だけ出したい」場面もけっこうあります。
たとえば、

  • 進捗バーみたいに記号を連続表示したい。
  • 1文字ずつ整形しながら出力したい。
  • 改行やタブなどの制御文字を、意図どおりに出したい。

こんなときに活躍するのが putchar関数 と、そこに渡す 文字定数 です。
今回は「文字を1個ずつ出す」感覚をつかみながら、文字定数の考え方も一緒に整理しますね。

サンプル:入力した回数だけ「#」を並べて表示する

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

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

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

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

int main(void)
{
    int count;

    printf("表示する個数を入力してください:");
    scanf("%d", &count);

    while (count-- > 0)
        putchar('#');

    putchar('\n');
    return 0;
}

実行例

表示する個数を入力してください:8
########

表示する個数を入力してください:0

表示する個数を入力してください:-3

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

putchar関数とは?(書式と役割)

putchar は 1文字だけ出力するための関数です。標準出力(通常は画面)に文字を1つ表示します。

putchar の基本

項目内容
役割1文字を標準出力に出す
書式putchar(文字);
戻り値成功時:出力した文字(int)/失敗時:EOF

実際の使用例はこんな感じです。

putchar('A');   // A を1文字出す
putchar('\n');  // 改行を1文字出す

while (count-- > 0) の意味を、丁寧に分解する

サンプルの核心はこの制御式です。

count-- > 0

ここには2つの要素が合体しています。

  • >:比較演算子(0より大きい?)
  • count--:後置減分(使った後に 1 減る)

count-- > 0 の評価の流れ

(1) count の「今の値」を取り出す
(2) その値が 0 より大きいか判定する
(3) 判定が終わった直後に count を 1 減らす

表:count が 3 のときに何が起きる?

判定回判定に使う count の値count > 0 ?判定直後の count
132
221
310
40-1

だから # は3個出るし、ループを抜けた後の count は -1 になることもあります。
(この「最後に -1 になる」挙動は、後置減分を条件式に入れているとよく起こるので、意識しておくと安心です。)

文字定数とは?('A' や '\n' みたいなやつ)

putchar('#'); の '#' は 文字定数(character constant)です。

文字定数のポイント

表記種類意味
'A'文字定数文字 A を表す(型は int)
'#'文字定数記号 # を表す(型は int)
'\n'文字定数改行(newline)を表す(型は int)

C言語では、文字定数の型は int です。
「え、charじゃないの?」って思うかもですが、式として扱うと int になる、というルールなんですね。

文字定数と文字列リテラルは別物(ここ超大事)

見た目が似ていて混乱しやすいので、ここでハッキリ分けます。

'a' と "a" の違い

書き方呼び名中身使いどころ
'a'文字定数1文字putchar や 1文字比較
"a"文字列リテラル文字の並び(最後に終端文字も含む)printf や puts

つまり、

  • putchar('#'); はOK(1文字)
  • putchar("#"); はNG(文字列)

という違いになります。

エスケープシーケンス('\n' の仲間たち)

改行の '\n' は、見えない制御文字を表すための表記です。よく使うものだけまとめます。

よく使うエスケープシーケンス

表記意味よくある用途
'\n'改行行を切り替える
'\t'タブ表のように揃えて表示
'\'バックスラッシュパス表示など
'''シングルクォート文字定数内で ' を表したいとき
'"'ダブルクォート文字列内で " を表したいとき

使いどころの感覚:putchar は「細かい出力の積み上げ」に強い

putchar は、1文字ずつ積み上げる出力に向いています。

printf と putchar の使い分け

やりたいこと向いている
文章や数値をまとめて表示printf
文字を1つずつ、ループで並べたいputchar
改行など制御文字を確実に出したいputchar

今回みたいに「同じ記号を何回も出す」用途は、putchar が気持ちよくハマります。

まとめ:文字定数と putchar を押さえると出力が自由になる

  • putchar は 1文字だけ出力する関数
  • putchar に渡すのは文字定数('#' や '\n')
  • 文字定数は 'a' の形で書き、型は int
  • "a" は文字列リテラルで別物
  • while (count-- > 0) は「判定してから減る」の合わせ技で、回数分の繰り返しが短く書ける。