【C言語入門】printfで文字列を表示(sprintfの使い方も解説)

printfを使って出力する文字列を編集してますか?

C言語ではprintf関数を使ってデバッグ内容の表示を行ったり、処理内容のログを表示したりします。そんな場合に、printf関数を使って表示形式をそろえたり、また文字を色付けなどして読みやすく編集できると便利です。

この記事では、文字列の出力と編集について

  • printfの使い方について
  • 変換指定子で変数を表示する方法
  • 出力文字列の書式を設定する方法
  • 出力文字列の編集について
  • sprintfの使い方について


など基本的な内容から、応用的な使い方の内容まで解説していきます。今回は文字列の出力と編集について、使い方をわかりやすく解説します!

目次

printfの使い方

printf関数は第1引数に出力表示したい書式文字列を、第2引数以降に出力表示に使用する変数を記入します。第2引数以降は可変長引数で、必要なだけ引数を指定することができます。

以下のように記述します。

printf(“書式文字列”, 変数1, 変数2, ・・・)

改行して表示する方法

文字列を改行して表示したい場合はよくあります。改行するには、改行コードを使用します。C言語の場合改行コードは「\n」になります。

それではサンプルコードで確認しましょう。

#include <stdio.h>
 
int main(void) {
    printf("おはよう\nこんにちは\nこんばんは");
    
    return 0;
}

実行結果:

おはよう
こんにちは
こんばんは

このサンプルコードでは、改行コード「\n」を使用して文字列を出力表示しています。実行結果を確認すると、改行コードで改行されて出力表示されているのがわかります。

引数を指定する方法

printf関数の第2引数以降に変数を指定して、その変数を使った文字列を表示してみましょう。第1引数の書式文字列内で第2引数以降の文字列を使用するには、「%」記号と変数の型を表す変換指定子を使用します。

変換指定子については後ほど詳しく説明しますが、ここでは文字列変数を第2引数に指定して表示する方法について見てみましょう。

#include <stdio.h>
 
int main(void) {
    char str1[16] = "侍";
    char str2[16] = "エンジニア";
    char str3[16] = "塾";
    printf("%s%s%s", str1, str2, str3);
    
    return 0;
}

実行結果:

侍エンジニア

このサンプルコードでは、第2引数以降に文字列str1、str2、str3を指定して、これらを順に表示するように第1引数で書式文字列を記述しています。なお、文字列の変換指定子は「s」になります。

変換指定子で変数を表示する方法

printf関数などで、出力表示したい文字列の中で変数の値を表示したい場合は、変換指定子という記号を使用します。変数の種類によって使用する変換指定子は異なります。

それぞれの変換指定子とそれに対応する変数の型は次のようになります。

指定子対応する型説明
cchar文字
schar *文字列
dint, short10進の整数
uunsigned int, unsigned short10進の符号なし整数
oint, short,
unsigned int,
unsigned short
8進の整数
xint, short,
unsigned int,
unsigned short
16進の整数
ffloat浮動小数点数
efloat浮動小数点数の指数表示
gfloat%eもしくは%fの
どちらか最適な形式の
浮動小数点数
ldlong10進の倍精度整数
luunsinged long10進の符号なし倍精度整数
lolong, unsinged long8進の倍精度整数
lxlong, unsinged long16進の倍精度整数
lfdouble倍精度浮動小数点数
adouble16進の倍精度浮動小数点数

変数を表示する方法

printf関数で変数を表示するには、「%」記号と変数の型を表す変換指定子を使用します。変換指定子の使い方について、サンプルコードで確認していきましょう。

#include <stdio.h>
 
int main(void) {
    char *str1 = "Hello";
    char *str2 = "World";
    char chr1 = '!';
 
     // 文字および文字列
    printf("%s %s%c\n", str1, str2, chr1);
 
    double d1 = 1.234567;
    double d2 = 12.34567;
    double d3 = 123.4567;
 
    // 浮動小数点数
    printf("d1:%f\n", d1);
    printf("d2:%f\n", d2);
    printf("d3:%f\n", d3);
  
    return 0;
}

実行結果:

Hello World!
d1:1.234567
d2:12.345670
d3:123.456700

このサンプルコードでは文字および文字列の出力変換の際にそれぞれに対応する指定子「c」と「s」を使用しています。また、浮動小数点数の出力変換には指定子「f」を使用して表示しています。

パーセントを表示する方法

printf関数で変数を表示するには、「%」記号と変換指定子を使います。では、「%」記号を表示したい場合はどうすればいいのでしょうか?

「%」記号を表示するには「%%」と記述すればOKです。サンプルコードで確認しましょう。

#include <stdio.h>
 
int main(void) {
    int num = 20;
    
    printf("降水確率は%d%%です", num);
    
    return 0;
}

実行結果:

降水確率は20%です

出力文字列の書式を設定する方法

フラグやフィールド幅、精度などを使って、左詰め、符号付き、桁のゼロ埋めなど出力文字列の書式を指定することができます。以下のように記述します。

% (フラグ) (フィールド幅.精度) 変換指定子

なお、 ( )で囲まれた部分は省略可能です。

フラグでは下記のように、左詰め、符号付き、桁のゼロ埋めなどを指定します。

フラグ説明
-左詰め(デフォルトは右詰め)
+符合付き(デフォルトは負の場合のみ)
0フィールド幅未満の場合、0(ゼロ)で埋める

フィールド幅で指定した桁数で出力表示します。変数の値が指定した桁数以下であった場合は、左側が空白で埋められます。精度は変換指定子によって表示が異なります。

変換指定子変数の型説明
dint, short最低表示桁数を表し足りない場合は0(ゼロ)で埋められます
f, efloat小数点以下に表示する桁数を指定
gfloat有効数字を指定
schar *最大表示文字数を表し数値以上の文字列は切り捨て

桁数、精度を指定する方法

桁数、精度を指定する方法について、サンプルコードで確認しましょう。

#include <stdio.h>
 
int main(void) {
    double d1 = 12.34567;
    double d2 = 123.4567;
    char str[8] = "Hello!";
 
    // 小数点以下の桁数指定
    printf("d1:[%.2f]\n", d1);
    printf("d2:[%.2f]\n", d2);
    
    // 有効数字の桁数指定
    printf("d1:[%.2g]\n", d1);
    printf("d2:[%.2g]\n", d2);
    
    // 文字数指定による切り捨て
    printf("str:[%.4s]\n", str);
    
    return 0;
}

実行結果:

d1:[12.35]
d2:[123.46]
d1:[12]
d2:[1.2e+02]
str:[Hell]

空白で埋める方法

空白で埋めるためには、フィールド幅を指定します。デフォルトでは右詰めで、左側が空白で埋められます。フラグで「-」を指定することで左詰めに設定することもできます。

サンプルコードで確認しましょう。

#include <stdio.h>
 
int main(void) {
    double d = 12.34;
    char str[8] = "Hello!";
 
    // 右詰め
    printf("d:[%10f]\n", d);
    printf("str:[%10s]\n", str);
    
    // 左詰め
    printf("d:[%-10f]\n", d);
    printf("str:[%-10s]\n", str);
    
    return 0;
}

実行結果:

d:[ 12.340000]
str:[    Hello!]
d:[12.340000 ]
str:[Hello!    ]

0(ゼロ)で埋める方法

0で埋めるには、フラグを「0」で指定します。サンプルコードで確認しましょう。

#include <stdio.h>
 
int main(void) {
    double d = 12.34;
    int num = 1234;
 
    // 0詰め
    printf("d:[%010f]\n", d);
    printf("num:[%010d]\n", num);
    
    return 0;
}

実行結果:

d:[012.340000]
num:[0000001234]

出力文字列の編集について

エスケープシーケンスを使って出力文字列を編集することができます。太文字や下線付きなどの文字属性の指定、前景色や背景色を指定することができます。

指定するコードは下記のとおりです。

文字属性の指定

コード説明
\x1b[0m属性のクリア
\x1b[1m太文字
\x1b[4m下線付き
\x1b[7m背景色と前景色を反転

前景色の指定

コード説明
\x1b[30m
\x1b[31m
\x1b[32m
\x1b[33m
\x1b[34m
\x1b[35mマゼンダ
\x1b[36mシアン
\x1b[37m
\x1b[39mデフォルトに戻す

背景色の指定

コード説明
\x1b[40m
\x1b[41m
\x1b[42m
\x1b[43m
\x1b[44m
\x1b[45mマゼンダ
\x1b[46mシアン
\x1b[47m
\x1b[49mデフォルトに戻す

コードは16進数を使用して\x1bと記述しますが、8進表現の場合は\033と記述します。コードをprintf関数の引数に指定して使用します。

なお標準のWindows環境下で実行すると次のように出力され修飾表示されません。

標準のWindows環境下:

[1m[41mError!!

Windows環境下ではansiconをダウンロード解凍後に、「x64」もしくは「×86」フォルダへ環境パスを設定してから、コマンドプロンプトで試してみて下さい。

太文字、下線付きで表示する方法

太文字、下線付きで表示する方法についてみていきましょう。

#include <stdio.h>
 
int main(void) {
    printf("\x1b[1m"); // 太文字出力
    printf("\x1b[4m"); // 下線付き出力
 
    printf("Error!!");
    
    return 0;
}

実行結果:
printf01

色を指定して表示する方法

前景色と後景色を指定して表示する方法について、サンプルコードで確認しましょう。

#include <stdio.h>
 
int main(void) {
    printf("\x1b[31m"); // 前景赤色出力
    printf("\x1b[43m"); // 背景黄色出力
 
    printf("Error!!");
    
    return 0;
}

実行結果:
printf02

sprintfの使い方について

sprintf関数を使うと、出力文字列を文字配列に代入することができます。以下のように記述します。

sprintf(代入する文字配列名, “出力文字列”, 変数1, 変数2, ・・・・)

sprintf関数の第3引数以降は可変長変数です。

sprintf関数の第1引数に代入する文字配列名を指定し、第2引数に出力文字列を、第3引数以降に出力文字列に含まれる変数を入力します。サンプルコードで確認しましょう。

#include <stdio.h>
 
int main(void) {
    char *str1 = "Hello";
    char *str2 = "World";
    char chr1 = '!';
 
    char str3[16];
 
    sprintf(str3, "%s %s%c\n", str1, str2, chr1);
    printf("%s", str3);
 
    return 0;
}

実行結果:

Hello World!

このサンプルコードではsprintf関数を使って、文字配列「str1」と「str2」および文字「!」を使用した出力文字列を文字配列「str3」に代入しています。そして文字配列「str3」をprintf関数を使って出力表示しています。

まとめ

ここでは、文字列の出力と編集について説明しました。

フラグ、フィールド幅および精度を設定することで出力表示をある形式にそろえることができます。また、エスケープシーケンスを使うことで、太文字や下線付き、色付けなどの修飾を行うこともできます。

目に留まりやすくまたわかりやすい出力表示となるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次