
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
表示する個数を入力してください:-30 や負の数のときは、ループ本体が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 |
|---|---|---|---|
| 1 | 3 | 真 | 2 |
| 2 | 2 | 真 | 1 |
| 3 | 1 | 真 | 0 |
| 4 | 0 | 偽 | -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) は「判定してから減る」の合わせ技で、回数分の繰り返しが短く書ける。
