今まで処理の部分に特化して説明してきました。が、そろそろつまんないですよね。そこで今回は C言語の標準的な入出力について解説していきます。
--
いきなりここに飛んで来ちゃった人は、よろしければ下記からご覧ください。
C言語基礎講座インデックス

なんか一気にプログラムらしくなりましたね。計算結果を画面に表示してこそのプログラミングなので、ようやくスタートラインと言ったところでしょうか。上記の文字列の中に %d とあるのが書式文字列です。scanf_s と同様、%d は整数置の表示を意味しています。この例では変数に計算結果を入れていますが、表示されるだけなら printf に中に直接計算式を記述しても OK です。
いきなりここに飛んで来ちゃった人は、よろしければ下記からご覧ください。
C言語基礎講座インデックス
- 標準入出力
C言語で標準的な入力と出力は、scanf と printf です。少なくともゲーム制作では全く使用されていないのですが、printf とかはデバッグ情報出力とかで今でも使う事はありますので、知っておいて損は無いと思います、
ただ、VS2022 では scanf は 非推奨となり、通常では使用する事が出来なくなってしまいました。そのため、本講座では代わりに用意された scanf_s という命令を使う事にします。他の開発環境では以前と同じく scanf が使えるかもデスし、また逆に scanf_s は VS2022 意外では使えないかもなので、その点はご注意ください。
scanf_s は多機能です。数値入力、文字入力、文字列入力などがこの命令一つで出来てしまいます。出力の printf も多機能です。数値の表示、文字や文字列の表示などができます。環境に依存してしまいますが、エスケープシーケンスという特殊な文字を表示する事で、色を付けたり表示位置を調整したりも出来ます。
今から20年前は、このエスケープシーケンスを使用してゲームも作成できたのですが、今の環境ではセキュリティの観点なのか多言語対応のためなのかは知りませんが、以前のように表示させる事が出来なくなりましたので、本講座ではエスケープシーケンスの説明は端折る事にしました。あしからずご了承ください。
- scanf_s で入力する
キーボードからの入力を実行する scanf_s は、以下のような文法となっています。
scanf_s(書式文字列, 変数の位置);
書式文字列は、今までも何度か言葉として出てきましたが、数値や文字などを扱うための形式を示すための文字列です。※ 変換指定子というのが正式らしいのですが、本講座では scanf_s も printf も全て書式文字列で統一します。
この書式文字列は以下の指定が可能です。※一部抜粋
"%d" | 整数 |
"%f" | 実数 |
"%c" | 1文字 |
変数の場所の指定ですが、入力する変数名の頭に & を付与してください。この & を付与する事で、変数がメモリ内のどこにあるのかという位置(アドレス)を指定する事になります。少し、より具体的にサンプルを提示してみます。
int num; scanf_s("%d", &num);
これで、num にキーボードから入力された数値が格納されます。以前解説したとおり、大きさが型の有効範囲を超えていた場合は、正常動作の保証がありません。整数以外も同様の書き方になります。
char moji; float actual; scanf_s("%c", &moji); scanf_s("%f", &actual);
この入力、2行に渡っていますが、入力時に「A 3.14」と半角スペースで区切っても正しく入力されます。そう、半角スペースは区切りコードなんです。なので…
char moji; float actual; scanf_s("%c %f", &moji, &actual);
って、やれば…と思うのですが、実はこれ正しく入力できないのです。ごめんなさい、私も理由は不明です。ですが…
int num1, num2; scanf_s("%d %d", &num1, &num2);
このように型を合わせると正しく入力できたりします。なので、連続入力させる際は同じ型で並べてください。というか、scanf_s たぶんこの講座以外ではもう使わないと思いますので、忘れても良いと思います(汗
※ 便利に使えるシチュエーションもあります。…たぶん(滝汗
- printf で出力する
画面に文字や数値を表示するのは、毎度おなじみ(?) printf を使います。この printf は未だに現役で使う事もあるので、しっかり覚えておきましょう。printf は以下のような文法となります。
printf(文字列, 変数の位置);
printf の文字列には scanf_s のような書式文字列も混ぜる事が出来ます。また、その混ぜた書式の数だけ、引数として同じ順番で変数を指定する事が出来ます。引数とは scanf_s や printf のような関数呼び出しの際に指定する値の事です。この引数により、関数の動作が変化します。
※ なんか元気になるらしいですw一番最初にこんな事を書きました。覚えてますか?
これは引数として "Hello, world!" という文字列を指定したので、画面にそのように表示したのです。この文字を変えるだけで動作が変わりますので、好きなように文字を書いてみます。
printf("Hello, world!");
#include <stdio.h> int main() { printf("C言語の勉強?"); printf("今まで楽勝だったぜ!"); }
これの表示結果はこうなります。

以前ちらと説明しましたが、プログラムが改行していても、実際の表示は改行しません。¥n というエスケープシーケンスを記述して初めて改行するのです。こちらはそれ以外には ¥¥, ¥', ¥" だけ覚えておいてください。文字列の中で ¥等を表示したいと思っても、そのままでは表示できないので、これらの文字表示はエスケープシーケンスで指定する事になります。I've mastered the "C language!!" と表示したければ…
printf("I\'ve mastered the \"C language!!\"");
このように記述します。
- printf で変数の内容を出力する
さて、変数の内容を表示するにはどうすれば良いでしょうか。さきほど、文字列に書式文字列を含める事が出来ると説明しました。なので、そこに %d 等の書式文字列を書いてしまえば良いのです。
int hour = 5; int min = 12; int sec = 37; int ans = hour * 60 * 60 + min * 60 + sec; printf("全ての合計秒数は%d秒です。", ans);
int hour = 5; int min = 12; int sec = 37; printf("全ての合計秒数は%d秒です。", hour * 60 * 60 + min * 60 + sec);
入力と異なり表示に関しては、表示を成形する為の拡張指定がいくつも用意されています。全部を覚えるのは難しくても、こんなのがあったなあと覚えておくだけで良いのです、そして、実際に使う時に、ググって調べれば良いです。それがネット時代のプログラミングスタイルです。という事で代表的な書式を列挙しておきます。
%6d | 表示桁数が6文字で右詰め表示 |
%-5d | 表示桁数が5文字で左詰め表示 |
%+5d | 表示桁数が5文字で符号表示(通常は+が表示されない) |
%08d | 表示桁数が8文字でゼロ埋め表示 |
%.3f | 実数の表示で小数点以下3文字 |
%8.2f | 実数の表示で全体が8文字、小数点以下2文字 |
注意点としては、書式文字列と変数の組み合わせが合わなくてもコンパイルが通り、実行時でおかしな表示になる事や、書式で指定した桁数より大きな数値が来た場合は、そちらの表示が優先されて指定からはみ出す事が挙げられます。※ エラーチェックは殆どないです。
あと、指定の組み合わせが出来ない場合があります。例えば、%+-16d と符号表示と左詰は同時に指定できますが、%-08d は左側に詰めて表示されるため、0 埋め指定が無視されます。
- 初めての 入力→処理→出力
では、いよいよ今まで学んだ事を全て組み合わせて試してみましょう。指定した時間がトータルで何秒なのか表示するプログラムを組んでみます。
#include <stdio.h> int main() { int hour, min, sec; /* 入力 */ printf("時分秒をスペースで区切って入力してください\n"); scanf_s("%d %d %d", &hour, &min, &sec); /* 処理 */ int ans = hour * 60 * 60 + min * 60 + sec; /* 出力 */ printf("\n全ての合計秒数は%d秒です。", ans); }
この実行結果は以下のようになります。

是非ご自分で VS2022 で実行して直接確認してみてください。あと、出力をこんな風に改造すると、さらに分かりやすいかもしれません。こちらは結果を載せませんので、VS2022 で試してみてください。
#include <stdio.h> int main() { int hour, min, sec; /* 入力 */ printf("時分秒をスペースで区切って入力してください\n"); scanf_s("%d %d %d", &hour, &min, &sec); /* 処理 */ int ans = hour * 60 * 60 + min * 60 + sec; /* 出力 */ printf("\n%02d時%02d分%02d秒の合計秒数は%d秒です。", hour, min, sec, ans); }
- まとめ
- 標準入出力
- scanf_s で入力する
- printf で出力する
- printf で変数の内容を出力する
- 初めての 入力→処理→出力
>> C言語 実力確認テスト01 基本入出力に進む
>> C言語008 エスケープシーケンスに進む
>> C言語基礎講座インデックスに戻る
大人になったらこんなのに頼らなきゃいけないかもしれない身体になってしまうんですよね(苦笑

アサヒグループ食品
2016-08-29
コメント