先づはprintf()関数を使用した次のソースコードをコンパイルしてみませう。
#include <stdio.h> #include <stdlib.h> int main (int ac, const char *av[]) { if (2 != ac) { fprintf (stderr, "Usage: %s arg1\n", av[0]); return EXIT_FAILURE; } printf (av[1]); return EXIT_SUCCESS; }
コンパイルして実行形式(a.out)ができたとします。
% ./a.out Hello
実行結果はこんな感じでせうか。
Hello%
次はかうです。
% ./a.out "Hello %d"
私の実行結果はこんな感じです。
Hello 0%
意味、分りますか? 第一引数はprintfの様式文と解釈されるのです。 もうひとつ実行してみませう。
% ./a.out "Hello %s"
私の実行結果はこんな感じです。
Hello (null)%
これが如何に危険な事かは分りますよね。 整数(%d)も文字列(%s)も指定してないんですから。 printf()関数はスタツクを勝手に整数や文字列と誤解して 表示してゐるわけです。
実は%nを使へばスタツクに書込みもできちやひます。 (%nは知らないつて、覚えなくて良い、と言ふより使つちや駄目)
本日の教訓:
printf()関数の第一引数には変数ではなく、 必ず文字列を指定しませう。