文字入出力
文字出力方法
文字の出力はライブラリ関数を使用して出力します。
以下に文字出力関数とその仕様を説明します。
今回使用する関数は全てstdio.hの関数ですので
使用する際は必ずstdio.hをインクルードしてください。
書式例
#include <stdio.h>
■printf関数
printf関数はC言語の中で最も一般的な出力関数です。
出力文字についても変数を使用することができる書式もありますので
汎用的な使用が可能です。
書式1
書式1は第1引数に指定した文字列をそのまま画面に出力します。
書式例
printf(char *);
具体例
printf("hello world");
実行結果:
hello world
書式2
特殊書式を使用した出力方法です。
この特殊書式を使用することで第2引数以降の値を
文字列に反映させることができます。
※特殊書式について次の項目で説明します。
書式例
printf(char *, 引数1...);
具体例
printf("score = %d", 100);
実行結果:
score = 100
特殊書式
まずは特殊書式の種類を紹介したいと思います。
特殊書式はprintfやscanfなどの文字列を扱う関数で使用されています。
printfでの使用方法はまず特殊書式(「%d」など)を使用した文字列を用意します。
次に第2引数以降に第1引数の特殊書式を宣言した順番通りに置き換えたい値を設定します。
具体例
int score = 100;
printf("%sのスコアは%dです。", "山田 太郎", score);
実行結果:
山田 太郎のスコアは100です。
この具体例の特殊書式は最初文字列の「%s」、次に整数の「%d」の順番で
文字列中に使用しており、第2引数以降も最初は文字列の「"山田 太郎"」、
次はint型の変数の「score」を設定していますので順番も問題ありません。
結果は「山田 太郎のスコアは100です。」と出力され、
無事特殊書式が置換されていることがわかります。
もし、"山田 太郎"とscoreの順番が逆だった場合は特殊書式の内容と
第2引数以降の値の型が合わないのでエラーになります。
特殊文字(エスケープシーケンス)
特殊文字(エスケープシーケンス)は改行やタブ文字などの文体を整えるものや
「"」や「'」などの文字や文字列として認識されてしまう文字を
使用するためのものまで複数用意されています。
具体例:
printf("改行を入れた\n文字列です。");
実行結果:
改行を入れた
文字列です。
桁数指定
数値表示の「%d」などの数値系の特殊書式は桁数をそろえることができる
書式が用意されています。
空白埋め
桁数が足りていない数値だった場合、足りない桁数分を空白で埋めてくれます。
書式
書式例
// 整数以外は「d」の部分を「f」や「x」に変更するだけ
printf("%桁数d");
具体例
int score = 100;
printf("score=%4d", score);
実行結果:
score= 100
具体例で桁数を4桁、数値を3桁(100)に設定して、
桁数が1桁足りないようにしています。
その結果わかりにくいですが「score= 100」と表示されて
足りていない1桁分にスペースが入っています。
0埋め
桁数が足りていない数値だった場合、足りない桁数分を0で埋めてくれます。
書式
書式例
// 整数以外は「d」の部分を「f」や「x」に変更するだけ
printf("%0数値d");
具体例
int score = 100;
printf("score=%04d", score);
実行結果:
score=0100
※最低桁数に対して足りていない場合に自動で挿入が行われますので
桁数をオーバーした場合は何も行われません。
sprintf or sprintf_s
sprintfはprintfで作成した文字列を文字列型に代入してくれます。
ただ、作成した文字列を代入する変数は領域を確保した
文字列(char* または char配列)でないと使用することはできません。
例えば "Hello World"という文字列をsprintfで代入しようとすると
12文字以上のchar型の配列、または12文字以上の領域を確保したchar*型が必要です。
※1.12文字というはHello Worldの11文字と終了文字(\0)が含まれています。
また、sprintfではprintfで使用された特殊書式、特殊文字の使用が可能です。
※2.sprintfは画面出力はありませんが、printfと同じ使用法が似ています。
書式
書式例:
sprintf(領域を確保したchar*, 文字列, 特殊書式で使用する値);
具体例:
char str[40];
sprintf(str, "こんにちわ。%sさん", "山田 太郎");
printf("作成した文字列は「%s」です。", str);
実行結果:
作成した文字列は「こんにちわ。山田 太郎さん」です。
scanf or scanf_s
scanfは画面内で入力された文字を変数に代入することができる関数です。
この関数で重要なことは代入する文字の型と入力する文字の型をあわせる必要があります。
例えば入力画面で数値を入力してほしい場合は受け取り側も数値の型で
受け取らないといけません。
書式
書式例
scanf(書式文字列, 受け取り予定の型のポインタ);
具体例
int test;
// 整数を受け取りたいのでint型のポインタを設定
scanf("%d", &test);
// 出力結果は入力された値が表示される
printf("test = %d", test);
実行結果:
test = 入力した値
上の具体例ではまずint型で入力された文字を受け取ることにして
int型の変数を宣言をします。
この変数を受け取り用としてscanfの第2引数に指定します。
第1引数はどの型で受け取るかで特殊書式を変更します。
特殊書式はprintfで使用している%dなどです。
scanfの注意点
型を一致させる必要がある
受け取り側の変数の型と入力側の変数の型は一致させる必要があります。
一致させなかった場合ですが、進行停止エラーにはなりませんが
代入された値に関しての保障はされません。
もちろん文字列を受け取るときはそれなりの領域を確保したchar型を
用意する必要があります。
空白類の文字は無視される
タブや改行、スペースは入力されても無視されます。
Hello Worldと入力した場合、プログラム側はHelloしか受け取りません。
scanf_sの場合で文字、文字列を使用する場合
scanf_sで文字、または文字列を使用する場合は文字数を
第二引数に指定する必要があります。
scanfの場合
char c;
// 文字数の指定は必要ない
scanf("%c" &c);
scanf_sの場合
char c;
// 第二引数に文字数の指定が必要
scanf_s("%c", &c, 1);
gets
getsは画面から入力された1行分の文字列を領域を確保したchar型に格納します。
sprintfと同様に文字列を代入するための領域を確保したchar型の用意が必要です。
scanfとgetsの使用方法を分けるとしたらscanfは数値用、
getsは文字列用に分けるといいかもしれません。
書式
書式例
gets(領域を確保したchar型のポインタ);
具体例
char str[40]; // 受け取る文字数分の数を用意
gets(str);
printf("%s", str);
出力結果:
入力された文字列が出力される