地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【C】基本的な話

他の人が書いた C 言語のプログラムを見ながら思ったのだが、 strcat や strcmp で文字列を切り貼りするのは止めて、 printf はフォーマット文字列をちゃんと使おう。

右寄せ・左寄せ・インデントが必要な場合でも、 1行を表示するのは1回の printf 呼び出しで間に合う場合がほとんどだよ。

文字列を表示する printf を使った文字列の表示は、 単純な %s に幅指定を行うことで 「詰めもの」をしたフォーマットが可能だ。

// 普通に表示 printf("A %s.\n", "01234567890123456789");

// 最小幅を指定 (右詰, 隙間は空白文字) printf("B %30s.\n", "01234567890123456789");

// 最小幅を指定 (左詰, 隙間は空白文字) printf("C %-30s.\n", "01234567890123456789");

// 最大幅を指定 (入力文字列の10文字分を表示) printf("D %.10s.\n", "01234567890123456789");

// 最大幅と最小幅を同時に指定 (入力文字列の10文字分を30文字の中で右詰表示) printf("E %30.10s.\n", "01234567890123456789");

// 最大幅と最小幅を同時に指定 (入力文字列の10文字分を30文字の中で左詰表示) printf("F %-30.10s.\n", "01234567890123456789"); このプログラムを実行すると以下のようになる。

A 01234567890123456789. B 01234567890123456789. C 01234567890123456789 . D 0123456789. E 0123456789. F 0123456789 . 幅を引数で指定 さらに数字を書くべきところを * にすることで、 引数を使った「幅」の指定が可能になる。

// 最小幅を引数で指定 printf("G %*s.\n", -40, "01234567890123456789");

// 最大幅を引数で指定 printf("H %.*s.\n", 10, "01234567890123456789");

// 両方を指定 printf("I %.s.\n", -20, 10, "01234567890123456789"); このプログラムを実行すると以下のようになる。

G 01234567890123456789 . H 0123456789. I 0123456789 . 引数を任意の順番に並べる printf 関数の引数はフォーマット文字列の並びに並べるのが普通だが、% の後に n$ を置くことで、引数の位置を変更することができる。

printf("%3$d %1$s %2$f\n", "abc", 1.4, 1234); このプログラムは以下のように出力される。

1234 abc 1.400000 幅指定の位置を変更することも可能だが。

printf("%2$1$d.\n"%, 10, 20); printf("%1$2$d.\n"%, 10, 20); このプログラムは以下のように出力される。

    20.
              10.

桁区切り %u、%d、%f などの 10 進表示の場合、3桁ごとにカンマ(,)で区切ることができる。 これは % と型指定子の間に ' をつける。

printf("%d -> %'d\n", 12345678, 12345678); printf("%f -> %'f\n", 9999.9999, 9999.9999); このプログラムは以下のように出力される。

12345678 -> 12,345,678 9999.999900 -> 9,999.999900 ただし 3 桁ごとの区切りが可能かどうか、また区切り文字が何になるかはロケールの LC_NUMERIC に依存する。 例えばロケールに C が指定されていると、桁区切りは出力されない。

include <locale.h>

setlocale(LC_NUMERIC, "C");