printfで文字列の最大文字数を指定する - 揮発性のメモ2
1234567890123456 じゃがいも :A ^^^^^^^^^^^^^^^^ ↑16文字
日本語混じりで桁を揃えてprintfで出力したい
localeをちゃんと設定してwcharを使うべきだが、できないときもある
環境を整えたくないので、とりあえずできる限りの手抜きをする
// 補正前 printf("%-16s:A", "じゃがいも"); printf("%-16s:A", "ターボR");
1234567890123456 じゃがいも :A ターボR :A
ずれてしまう。
なぜかというと、UTF8では日本語は3バイトだが表示上は2文字分のため UTF8の文字数分だけ誤差が出る。
つまり、UTF8の文字数だけprintfの幅を足してしまえばいい
超簡易的に判定するなら、UTF8の文字数を足す
int count8(const char *s) { int len = 0; while(*s){ if((*s & 0xC0) == 0xC0) len++; s++; } return len; }
printf("%-*s:A", 16+count8("じゃがいも"), "じゃがいも"); printf("%-*s:A", 16+count8("ターボR"), "ターボR");
1234567890123456 じゃがいも :A ターボR :A
当然3バイト文字にしか対応していないので、これ以上のことをするならきちんと環境をととのえること