C言語のprintfに *
というものがあります。
#include <stdio.h>
int main()
{
printf("%*s\n", 5, "aa"); // ' aa' が出力される(左3文字空白)
printf("%*s\n", 5, "aaaabbbb"); // 'aaaabbbb' が出力される
printf("%.*s\n", 5, "aaaabbbb"); // 'aaaab' が出力される
return 0;
}
つまり、*
は引数で表示する文字数を定義できるということですね。*
だけだと、定義文字長を超えた文字列が与えられると全部表示されますが、.
と組み合わせることで、定義文字長で切って表示することが可能です。
この書式を使う場面としては、整形もそうですが、どんな長さの文字列が来るかわからない場合にとりあえずバッファのMAXサイズでぶった切る。ってのにも使えそうですね。まぁ、そういう場合はちゃんと長さチェックしてから処理するんでしょうけどね(^ ^;)
#include <stdio.h>
#define MAX_LENGTH 8
/*
* in_strの先頭5文字(正確にはMAX_LENGTH-2文字)
* に括弧をつけてbufに格納する
*/
void string_print(char *buf, char *in_str)
{
char *format[] = "(%.*s)";
unsigned int disp_len = MAX_LENGTH - 2; // -2は書式内の()の分
sprintf(buf, format, disp_len - 1, in_str); // -1 は \0の分
}
int main()
{
char buf[MAX_LENGTH];
string_print(buf, "aaaabbbb");
printf("%s\n", buf);
return 0;
}