Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2021年1月2日に更新

第2章06 いろんな書式指定子

イチからゲーム作りで覚えるC言語
第2章05 文字列変数の宣言、初期化と表示 : PREV
NEXT : 第2章07 変数に配列を使う :

この記事でやること

前回はプロジェクト「0040_mojiretsu」を新しく作り、文字列変数を使って文字を表示するプログラムを作成しました。いままでにprintf関数で表示するときに %d、%f、%s とか、いくつかの変換指定子(Conversion specifiers)を説明してきました。

今回は、いままで説明したものを含む、よく使ういくつかの変換指定子をお話し、便利な表示方法を作ってみましょう。

いくつかの変換指定子を使用したプログラム

ではでは 文字列を取り扱うサンプルプログラムを作成してみましょう。 プロジェクト「0050_stringformatid」を新しく用意し、プロジェクトに空の「Conversion.c」を追加し、下のソースコードをコピペして動かしてみましょう

Conversion.c
#include <stdio.h>
int main() {
 char keytype = 'b';
 char *player = "ぷらんく";
 char *theif = "盗賊";
 short level = 5;
 float breakkeyPerc = 3.2F;
 double biorhythm = 5.123L;
 
 printf("%s:タイプ %c の鍵って売ってますか?\n", player, keytype);
 printf("%s:売ってない。ロックピックならあるぜ\n", theif ));
 printf("%s:わたしの開錠スキルどれくらいだったっけ\n\n", player);
 printf("+------[ステータス]------+\n");
 printf("|%10s : %-11s|\n", "名前" , player );
 printf("|%10s : %03d |\n", "レベル" , level );
 printf("|%10s : %8.1f %% |\n", "開錠確率" , breakkeyPerc);
 printf("|%10s : %+8.3lf %% |\n", "体調", biorhythm);
 printf("+------------------------+\n");
}

コピペなりして、実行してみると、下の結果になると思います。

Conversion.c
ぷらんく:タイプ b の鍵って売ってますか?
盗賊:売ってない。ロックピックならあるぜ
ぷらんく:わたしの開錠スキルどれくらいだったっけ
 
+------[ステータス]------+
|      名前 : ぷらんく   |
|    レベル : 005        |
|  開錠確率 :      3.2 % |
|      体調 :   +5.123 % |
+------------------------+

3 ~ 8行目はここまでこのシリーズで何度かお話した、変数の初期化を行っています。いままでの復習も含めて、いろいろと変数も入れています。 9行目までプログラムが実行された時点で、変数はこんな状態になっています。

  • 変数「keytype」には数値「66」が入っており、文字では「b」に相当する。
  • 変数「player」には文字列「ぷらんく」 が入っている。
  • 変数「theif」には文字列「盗賊」が入っている。
  • 変数「level」には整数 5 が入っている。
  • 変数「breakkeyPerc」には float 型の小数 3.2 が入っている。
  • 変数「biorhythm」には double 型の小数 5.123 が入っている。

今回は 10 行目以降の、文字を表示するところを書いていきます。 といっても10行目、11行目はこのシリーズの前記事でもお話した、「%s」「%c」という整数を表示する変換指定子(Conversion specification)を使っています。「%s」が文字列の表示、「%c」は一文字を表示となります。 よく使用する変換指定子をまとめます。

よく使われる変換指定子

int 型とか char 型とかそれぞれの型にあわせて変換指定子を使い分ける必要があるので気を付けでくださいね。今後よく使いそうな指定子と使用例を書いておきます。べつに暗記する必要はないので、必要なときに検索したり振り返れば良いかと思います。 ここに記載のない変わった指定子もあるので、また今度、別の機会に一覧と使い方をまとめたいと思います。

よく使われる書式指定子と使い方の例

処理 記号
1文字表示 %c char input = 'A';
printf("A と B、選ばれたのは %c のお茶でした", input);
文字列を表示 %s char* message = "ここははじまりの村ですか?";
printf("ぷらんく:%s", message);
整数を表示 %d short life = 3;
printf("のこりライフは %d です。", life);
long型の整数を表示 %ld long exp = 123456789L;
printf("次のレベルまで経験値が %ld 必要。", exp);
float型の浮動小数点数を表示 %f float taion = 35.0f;
printf("体温は %f です。低体温症のステータス。", taion);
double型の浮動小数点数を表示 %lf double kyori = 149597870.0 * 1000.0;
printf("太陽までの距離は %lf メートル", kyori);
浮動小数点数を指数形式で表示 %e double kyori = 149597870.0 * 1000.0;
printf("太陽までの距離は %e メートル", kyori)
※ 指定子の部分は「1.495979e+11」で表示

表示するときに桁数、右詰、左詰めを指定

14行目について、見ていきましょう。ここでは2つの文字列を表示しています。

Conversion.c
printf("|%10s : %-11s|\n", "名前" , player );

printf関数の一つ目の引数の中で書いている、「%10s」ですが、「10文字の幅を確保して、右詰めで文字を表示する」という意味になります。書き方は「%文字幅s」です。「%s」にプラスして、「表示する文字幅」と「右詰め」を指定しています。 ここでは文字列「名前」を「%10s」に従って表示しています。

そして、次の「%-11s」ですが、「11文字の幅に左詰めで文字を表示する」という意味になります。書き方は「%–文字幅s」です。「%」の隣に「-」マイナス記号がありますが、これを書くことで「左詰め」という意味になります。 ここでは変数 player の中身を「%-11s」に従って表示しています。

表示するときの数字を0埋め指定

15行目について、見ていきましょう。ここでは整数であるレベルを 3 桁で表示しています。

Conversion.c
printf("|%10s : %03d |\n", "レベル" , level );

最初の「%10s」は先ほどお話しました。次の「%03d」ですが、「3文字ぶんの幅を使って数字を表示する。空いた部分は 0 で埋めて表示する」という意味になります。「%d」にプラスして、「文字幅」と、「0埋め」を指定しています。

小数点以下の表示桁数を指定

16行目について、見ていきましょう。

Conversion.c
printf("|%10s : %8.1f %% |\n", "開錠確率" , breakkeyPerc);

数値の表示でプラス・マイナスの以下の表示桁数を指定

17行目について、見ていきましょう

Conversion.c
printf("|%10s : %+8.3lf %% |\n", "体調", biorhythm);

ここでは「%+8.3lf」という書き方が登場します。ここの+記号は「数値が 0 以上ならプラス記号をつけて表示する」という意味になります。 ですので、この+記号をつけると、かならずプラス・マイナスの記号が数値の前につきます。 また、その後の「%%」は単純に一つの「%」を表示する、という意味になります。

よく使われる表示の桁や右詰・左詰めなどのまとめ

よく使われる桁や右詰め・左詰めなどの使用例をまとめておきます。

よく使われる表示整形のための指定子と使い方の例

結果(□はスペース)
printf("%7s" , "Okome"); 7文字幅で右詰めで表示します。
"□□Okome"
printf("%-7s" , "Tabeyo"); 7文字幅で左詰めで表示します。
"Tabeyo□□"
printf("%06d" , 5000); 6文字幅 0埋め で表示します。
"005000"
printf("%+5d" , 123); 5文字幅 プラス記号付き、右詰で表示します。
"□+123"
printf("%6.3f" , 9.876543f ); 全体6文字幅、小数点以下 3 桁で右詰めで表示します。
"□9.877"
※表示されない4桁目が「5」で四捨五入され、3桁目が「6」から「7」になっています。
printf("%+6.1f" , 12.34f ); 全体6文字幅、小数点以下 1 桁で右詰めで表示します。
"□12.3"
printf("%-+6.1f" , 56.78f ); 全体6文字幅、小数点以下 1 桁で左詰めで表示します。
"+56.7□"
printf("%2s" , "Afureta"); 全体2文字幅で文字を表示しようとしますが、文字はもっと長いので溢れます。
"Afureta"
※こんな感じで、文字幅を超えないと表示できないときは、文字幅を指定しても、幅を超えて表示されます。つまり、文字幅を指定すると「最低限表示に使われる文字幅」を指定したということになります。

おまけの細かなお話

このページでまとめた指定子について、自分なりに調べた内容をメモしています。 詳しいお話や間違ってるよ!というご指摘があればこっそりコメントなどで教えてもらえると嬉しいです。

識別子って何?

そもそも指定子ってなんだろ?って気になる方。ここでは指定子とはあらかじめ仕様で決められた、他と区別するための文字記号の組み合わせ、くらいの認識で良いかと思います。 ここからは細かい話と自分なりのメモですが、手元にあるC言語仕様書的な本「THE C PROGRAMMING LANGUAGE 初版」(K&R著)では%c とか %f とかのことを identifier とか specifier ではなく、"% sign"(%の記号)とか "The conversion specification" (直訳:変換のための記述)って書いてました。2018年5月時点で最新のC11規格N1570でも同じ表現でした。

%s とか %f の仕様は誰が決めたの?

厳密にはそもそも printf 関数の指定子である %s とか %f とかの仕様はそもそもC言語として決めた仕組みじゃないらしいです。C言語が利用している当時のUNIX標準ライブラリ側の仕様を使ってるよ!ってかいてありました。(K&R本) VisualStudio のC言語コンパイラ処理系でも printf 関数は OS が標準的に利用する DLL (Dynamic Linker Library:標準的な機能をまとめた必要に応じて呼び出すことのできるライブラリ)の機能を呼び出して使っているようです。

変換指定子って何を指してる?

英語のC言語関連、標準ライブラリ関連の資料を読んでると、Conversion Specification(日本語で変換指定子)は、 Format Specifiers(日本語で書式指定子、フォーマット指定子)のなかの、特に、printf関数等でデータを文字に変換する「%d」や「%f」という指定子のみを限定して指しているという意味のようです。(が、自信がないので詳しい方いましたら教えていただけると嬉しいです。)

あとがき

普段は扱わない様々なフォーマット指定法の記述方法があり、柔軟に数値を出力できて便利ですね!

ゲームで 3D 系の数値をデバッグするとき等、邪魔な小数点〇〇以下を切り捨てしたりで桁を整えたい時がよくあるので、そんな時に活用できます。

C言語だけでなく、他のプログラミング言語でも同様の変換指定子が使われることが多いので、よく使う書き方は覚えておくと効率アップするかもしれません!

非常に参考になったサイトさまや、参考文献など

MSDN – 書式指定構文: printf 関数と wprintf 関数

ページの更新履歴

更新日 更新内容
2021/01/01 サイト内容を見直し
イチからゲーム作りで覚えるC言語
第2章05 文字列変数の宣言、初期化と表示 : PREV
NEXT : 第2章07 変数に配列を使う :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

ゲーム等で使えるつなぎ目のないループするテクスチャ画像の作り方

#ツール#ゲームプログラミング✎ 2021-01-24
ゲームなどで使えるループ画像、パターンテクスチャのツール、手動での作り方をまとめ
広告領域
追従 広告領域
目次
第2章06 いろんな書式指定子
第2章06 いろんな書式指定子
この記事でやること
この記事でやること
いくつかの変換指定子を使用したプログラム
いくつかの変換指定子を使用したプログラム
よく使われる変換指定子
よく使われる変換指定子
よく使われる書式指定子と使い方の例
よく使われる書式指定子と使い方の例
表示するときに桁数、右詰、左詰めを指定
表示するときに桁数、右詰、左詰めを指定
表示するときの数字を0埋め指定
表示するときの数字を0埋め指定
小数点以下の表示桁数を指定
小数点以下の表示桁数を指定
数値の表示でプラス・マイナスの以下の表示桁数を指定
数値の表示でプラス・マイナスの以下の表示桁数を指定
よく使われる表示の桁や右詰・左詰めなどのまとめ
よく使われる表示の桁や右詰・左詰めなどのまとめ
よく使われる表示整形のための指定子と使い方の例
よく使われる表示整形のための指定子と使い方の例
おまけの細かなお話
おまけの細かなお話
あとがき
あとがき
非常に参考になったサイトさまや、参考文献など
非常に参考になったサイトさまや、参考文献など
ページの更新履歴
ページの更新履歴
Nodachisoft © 2020