45
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

printfの書式の * ってなんだ?

Last updated at Posted at 2014-05-17

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;
}
45
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?