広告

printf()関数(その1) C/C言語上級講座

先づは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()関数の第一引数には変数ではなく、 必ず文字列を指定しませう。

Copyright © 皇紀2670 Ezo Labo. All Rights Reserved.
皇紀2670年05月20日更新
TOPへ