• ベストアンサー

printfについて

他サイトにて非常に興味の有るコードがあったのですが、そのサイトは訳合って見れなくなってしまったのでこちらで聞かせてください。 下記のprintfの中の、%.*sはどう解釈したら良いのですか? % . * s それぞれどういう意味が有るのですか? 始めて見るパターンなので分かりません。 #include <stdio.h> #include <stdlib.h> #include <locale.h> int main(void) { char a[] = "あいaう"; char *p; int len; setlocale(LC_CTYPE, ""); for (p = a; *p; p += len) { len = mblen(p, MB_CUR_MAX if (len <= 0) break; printf("%d: %.*s\n", len, len, p); } return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.1

%s(文字列)でも桁数の指定なんてできるんですね。 始めてしりました。 ご存知のようにprintfは%fで実数を表示できますが、  printf("%f",123.456);  123.456 これは桁数の指定が出来ますよね。  printf("%6.2f",123.456); /* 最大6文字、小数点以下2桁の意 */  123.45 これの変形で*を使うとプラグラム中で動的に桁数を指定できます。  printf("%*.*f",5,1,123.456); /* printf("%5.1f",123.456)と同じ */  123.4 これを文字列に持ちこむと、  printf("%*.*s",4,2,"abcde")  __ab /* 「_」はスペースの意 */ という結果になります。 左が最大表示文字数(右詰めで表示される)で、右が表示する文字数。 これの左を省略して自動的に処理させるようにしたのが、  printf("%.*s",3,"abcde");  abc です。 printf("%d: %.*s\n", len, len, p); はそれぞれ、  d → len  * → len  s → p が適用されます。

VitaminBB
質問者

お礼

大変詳しくありがとうございました。 *はポインタではなくワイルドカードだったのですね。 これですっきりしました。

その他の回答 (1)

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

文字列の一部分だけを出力したい時に使ってます。 printf("%.3s", "abcdef"); 決まった桁数の時 printf("%.*s", 3, "abcdef"); 桁数を変数などで指定したいとき  とすると、abc だけが出力されます。 これ以外で、同様のことをさせようとすると、 一旦ワーク変数にコピーして、'\0'を後ろにつけて出力 になるので、結構手間です。

VitaminBB
質問者

お礼

回答ありがとうございます。

関連するQ&A