3
1

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 1 year has passed since last update.

printfの%sで、表示文字数を動的に指定

Last updated at Posted at 2022-04-18

printfでできます

  • 動的に指定した文字数による文字列切り詰め処理と、左詰め・右詰め処理は標準の printf だけで実現可能です。

    char* buf = "abcde";
    printf("%*.*s", 10, 3, buf); // --> '       abc'
    printf("%-*.*s", 10, 3, buf); // --> 'abc       '
    
    • %sだけ → 最後まで表示
    • %Xs (ドットの前) → 最低表示幅 X を確保し、最後まで表示。右詰め。左に空白。
    • %.Ys (ドットの後) → 文字数 Y で切り詰めて表示
    • %-s (マイナス) → 左詰め。右に空白挿入
    • これら数字は"*"にすれば、引数で指定できる!
  • フォーマット指定 引数 (buf="abcde") 結果
    "%s" buf 'abcde'
    "%3s" buf 'abcde'
    "%10s" buf '_____abcde'
    "%-10s" buf 'abcde_____'
    "%10.3s" buf '_______abc'
    "%-10.3s" buf 'abc_______'
    "%3.10s" buf 'abcde'
    "%*.*s" 10, 3, buf '_______abc'
    "%-*.*s" 10, 3, buf 'abc_______'

これを知ってしまうと今まで入れていた前処理がいらなくなって随分楽できるようになりました。

関連

formatライブラリ

  • std::formatを使うとC++風に文字列処理を実現できる、はずですが、現時点(2022/04/18)ではmacではまだ使えないようです。
  • 昔から標準のstd::coutは、全体の文字列の途中にオペレータを記述しなくてはならず、出したい文字列の全体像がつかめなくなりがちで不便です。
  • ということで結局、2022年今日でも30年前から続いているprintfが使われることが多いです。
  • ライブラリごとに書式は異なりますが、printfの場合は%3.1fのように%fの間に全体幅.小数点以下の幅をすることで表示する精度を指定できます。
    // coutは表示される全体像がつかみにくい
    cout << "これは、" << nameofmycat << "を飼うために貯めた" << totalmoney << "円です。" << endl;
    // printfなら文章として読みやすい。
    printf("これは、%sを飼うために貯めた%d円です。", nameofmycat, totalmoney);
    // 数字の精度指定
    printf("%4.2f", 3.141592653589); // --> 3.14
    

参考

3
1
2

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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?