C言語のきほん|printfで文字と文字列を出力する

文字・文字列・%記号まで、printfで思いどおりに表示しよう。表示の基本をここでしっかり固めよう。

C言語の学習を進めていくと、数値だけでなく、文字や文字列を表示したくなる場面がどんどん増えてきます。
たとえば、メニュー表示、エラーメッセージ、入力案内、結果の説明文など、実際のプログラムでは文字の表示はとても大事です。

ここで活躍するのが printf 関数です。
printf は整数や小数だけでなく、1文字文字列 も表示できます。さらに、少し紛らわしい % 記号そのものを表示する方法もあります。

このあたりをしっかり理解すると、画面表示がかなり自由に作れるようになります。
特に、文字は %c、文字列は %s、%記号は %% というルールは、printf を使ううえでの基本セットです。

ここでは、文字と文字列の表示の違いをやさしく整理しながら、サンプルプログラムと一緒に丁寧に解説していきます。
あわせて、よく出てくる変換指定子の名前の由来も、覚えやすい形でまとめていきます。

文字と文字列はどう違うのか

まず最初に、ここを整理しておくと理解しやすくなります。

C言語では、文字と文字列は似ているようで別物です。

  • 文字:1文字だけ
  • 文字列:0文字以上の文字の並び

書き方も違います。

  • 文字はシングルクォーテーションで囲む
    例:A、Z、!
  • 文字列はダブルクォーテーションで囲む
    例:Hello、C言語、空文字列

コードで見るとこんな違いです。

'A'      /* 文字 */
"ABC"    /* 文字列 */

この違いは printf で表示するときの書式指定にも関係してきます。

コンピュータの中では文字も数値として扱われる

少しだけ仕組みの話をすると、コンピュータの内部では文字も文字コードという数値で扱われています。
つまり、見た目は文字でも、内部では整数値として管理されているイメージです。

そのため、printf では「この値を文字として表示したい」「文字列として表示したい」と指定してあげる必要があります。
その指定に使うのが変換指定です。

文字・文字列・%記号で使う書式指定

今回のテーマで使うのはこの3つです。

書式指定意味使いどころ
%c文字1文字を表示したいとき
%s文字列文字列を表示したいとき
%%%記号% をそのまま表示したいとき

ここはセットで覚えるのがおすすめです。

  • %c は character
  • %s は string
  • %% は % 自体を表示する特別ルール

%c で文字を表示する

%c は 1文字を表示するときに使います。
文字定数を渡して表示するのが基本です。

例:

printf("文字: %c\n", 'A');

実行結果

文字: A

複数の文字も並べて表示できます。

printf("%c %c %c\n", 'A', 'B', 'C');

このとき、書式指定の数と、後ろに渡す値の数をそろえるのがポイントです。

%s で文字列を表示する

%s は文字列を表示するときに使います。
文字列リテラルをそのまま渡すこともできますし、あとで学ぶ文字配列の内容を表示するときにも使います。

例:

printf("文字列: %s\n", "Hello");

実行結果

文字列: Hello

複数の文字列も表示できます。

printf("%s %s\n", "hello", "world");

実行結果

hello world

%% で %記号を表示する

ここは printf の中で特に大事なポイントです。
% は書式指定の開始記号なので、そのまま書くと「変換指定のつもりかな?」と解釈されます。

そのため、% 記号そのものを表示したいときは %% と書きます。

例:

printf("達成率: 80%%\n");

実行結果

達成率: 80%

この %% は実務でもよく使います。
割合やパーセント表示を出すときに必須です。

サンプルプログラムで確認しよう

ファイル名:5_5_1.c

#include <stdio.h>

int main(void)
{
    /* 文字を3つ表示する */
    printf("記号: %c %c %c\n", 'X', 'Y', 'Z');

    /* 文字列を2つ表示する */
    printf("あいさつ: %s %s\n", "おはよう", "ございます");

    /* パーセント記号を表示する */
    printf("進捗率: 75%%\n");

    return 0;
}

実行結果例

記号: X Y Z
あいさつ: おはよう ございます
進捗率: 75%

サンプルプログラムの解説

%c は1文字ずつ対応する

printf("記号: %c %c %c\n", 'X', 'Y', 'Z');

この行では、書式文字列の中に %c が3つあります。
そのため、後ろの値も3つ渡しています。

対応は左から順番です。

この順番対応は printf 全体の基本ルールです。

%s は文字列をそのまま表示できる

printf("あいさつ: %s %s\n", "おはよう", "ございます");

%s を使うと、文字列リテラルをそのまま表示できます。
日本語のメッセージを作るときにもよく使います。

なお、文字列の中に空白を入れたい場合は、書式文字列側に空白を書くのが簡単です。
この例では %s と %s の間に空白を入れているので、表示も自然な形になります。

%% で % を1つ表示する

printf("進捗率: 75%%\n");

%% と2つ書いて、実際には % が1つ表示されます。
ここは最初にかなり間違えやすいポイントなので、早めに慣れておくのがおすすめです。

文字と文字列の違いを表で整理

混ざりやすいので、ここで一度整理しておきましょう。

項目文字文字列
意味1文字複数文字の並び
書き方'A'"ABC"
printfの書式指定%c%s
'X'"こんにちは"

ここを区別できるようになると、printf のミスがかなり減ります。

よくあるミスと注意点

%c と %s を混同する

よくあるのがこれです。

  • 文字なのに %s を使う
  • 文字列なのに %c を使う

たとえば 'A' は文字なので %c、"A" は文字列なので %s です。
見た目は似ていますが、シングルクォーテーションかダブルクォーテーションかで意味が変わります。

% を1つだけ書いてしまう

次のような書き方はミスのもとです。

printf("進捗率: 75%\n");

この % は書式指定の開始記号として解釈される可能性があるので、%記号を表示したいときは %% を使います。

printf("進捗率: 75%%\n");

書式指定の数と値の数が合っていない

たとえば %c が3つあるのに、値を2つしか渡していないと正しく動きません。

良い例

printf("%c %c\n", 'A', 'B');

注意が必要な例

printf("%c %c\n", 'A');

printf では、書式指定と値の数をそろえるのが基本です。

変換指定子の名前も一緒に覚えると便利

ご提示のとおり、変換指定子は英語の頭文字をもとにしたものが多いです。
意味とセットで覚えると忘れにくくなります。

変換指定子英語意味
cCharacter文字
dDecimal10進数
xheXadecimal16進数
oOctal8進数
fFloating point浮動小数点数
eExponent指数表記
sString文字列

特に今回のテーマでは、c と s をしっかり押さえるのが大切です。
すでに学んだ d、o、x、f、e と一緒に並べて覚えると、printf の全体像が見えてきます。

printfで文字と文字列を扱えるようになるとできることが増える

文字と文字列の表示ができるようになると、プログラムの表現力が一気に上がります。

たとえば、こんな表示が作れるようになります。

  • メニュー画面の表示
  • 案内メッセージ
  • 結果のラベル付き表示
  • 記号を使った見やすい画面表示

数値だけの表示より、文字列を組み合わせた表示のほうが、ユーザーにも自分にもわかりやすいプログラムになります。
printf の %c、%s、%% は、そのためのとても基本的で大切な道具です。

表示の組み合わせ例を見てみよう

最後に、文字・文字列・数値・%記号を組み合わせるとどうなるか、イメージしやすい例を載せておきます。

例:

ファイル名:5_5_2.c

#include <stdio.h>

int main(void)
{
    char grade = 'A';
    int score = 92;

    printf("判定: %c\n", grade);
    printf("メッセージ: %s\n", "よくできました");
    printf("達成率: %d%%\n", score);

    return 0;
}

このように、今まで学んだ書式指定を組み合わせることで、かなり実用的な表示が作れるようになります。
printf は覚えることが少しずつ増えますが、1つずつ使っていけば自然と慣れていけます。