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
参考