【C】printfで文字列の一部を表示する(最長制限)

2015-02-11

文字列の全体ではなく指定の長さだけ出力したい場合どうするか。

%.*s と指定して、パラメータに長さ(int)、文字列の順に与える:

int len = 4;
const char* str = "abcdefg";
printf("[%.*s]\n", len, str); // => [abcd]

文字列の長さが指定より短い場合には、文字列全体が出力される。

解説

* で精度の引数指定

なぜ上記で指定できるのかというと % 以降に記述する指定子に * というものがあり、 int 型を受け取り精度を指定できる。

例えば数値を指定の幅で出力したい場合に

printf("[%5d]", 123);  // => [  123]

というところを、 * 指定子を使うと引数で指定できて

printf("[%*d]", 5, 123);  // => [  123]

と書ける。

. で文字列の最長指定

また文字列の場合、通常の幅指定だと所定の長さ以下の場合にスペースで埋める:

printf("[%5s]\n", "abc");   // => [  abc]
printf("[%-5s]\n", "abc"); // => [abc ] 負で左詰め

が、浮動小数点数の小数点以下の精度の指定 %.2f と同様に . 以下にも精度の指定ができて、その場合は最大の長さの制限になる(短い場合には影響なし):

printf("[%.5s]\n", "abc");  // => [abc] 指定より短いのですべてが出力される
printf("[%.2s]\n", "abc"); // => [ab] 長さが制限される

でこの小数点以下の精度指定も引数によって指定することで、上記のフォーマットとなる。

参考

変換の精度指定: . に続く整数値または ** が使用される場合、精度int 型の追加引数で指定される。

精度 は出力される最大バイト数を指定する。 精度 が指定されない場合、最初のヌルターミネートまでのすべてのバイトが出力される。