コードを眺めて悩む時間を、変数の値を「見る」時間に変える。初学者のためのいちばん実用的なデバッグ入門。
printf("変数名=%d\n", x);\n)// 怪しい場所に printf を山ほど入れる printf("[DEBUG] i=%d, sum=%d\n", i, sum);
for (int i = 0; i < 5; i++) { sum = sum + arr[i]; printf("[DEBUG] i=%d, arr[i]=%d, sum=%d\n", i, arr[i], sum); // ← これ }
int calc(int a, int b) { printf("[DEBUG] calc 入口: a=%d, b=%d\n", a, b); int result = a * 2 + b; printf("[DEBUG] calc 出口: result=%d\n", result); return result; }
printf("[DEBUG] 判定前: score=%d\n", score); if (score >= 60) { printf("[DEBUG] 合格ルート\n"); printf("合格\n"); } else { printf("[DEBUG] 不合格ルート\n"); printf("不合格\n"); }
int sum = 0; for (int i = 1; i < 10; i++) { sum = sum + i; } printf("合計 = %d\n", sum); // 出力: 合計 = 45 // 「あれ? 55 のはずじゃ?」 // ...コードを10分間眺める... // ...まだ分からない...
int sum = 0; for (int i = 1; i < 10; i++) { sum = sum + i; printf("[D] i=%d sum=%d\n", i, sum); } printf("合計 = %d\n", sum); // 出力: // [D] i=1 sum=1 // [D] i=2 sum=3 // ... // [D] i=9 sum=45 ← i が 10 まで行ってない! // 合計 = 45
i < 10 と i <= 10 の違いが頭の中で曖昧なまま、バグが消えない。| 型 | 書式 | 例 | 出力例 |
|---|---|---|---|
int | %d | printf("%d", x) | 42 |
long | %ld | printf("%ld", y) | 1234567890 |
float / double | %f | printf("%.2f", z) | 3.14 |
char | %c | printf("%c", c) | A |
char[] / 文字列 | %s | printf("%s", s) | Hello |
| ポインタ/アドレス | %p | printf("%p", p) | 0x7ffee... |
| 16進数 | %x | printf("%x", n) | ff |
printf("[D] var1=%d var2=%d\n", var1, var2); を何度もコピペして変数名だけ書き換える。改行 \n を忘れないこと(次項参照)。
\n がないとすぐ表示されない\n が来ると初めて画面に出す(行バッファリング)。
printf("[D] ここまで来た"); // ← \nなし → まだ画面に出ない! // クラッシュして原因調査しても「[D] ここまで来た」が出ないので // 「ここまで来ていない」と勘違いしてしまう。
\n を付ける。もしくは fflush(stdout); を直後に呼ぶ。double x = 3.14; printf("%d\n", x); // ❌ %d は int 用、結果は予測不能なゴミ値
-Wall で warn を有効に。[DEBUG] や [D] といった識別子付きで書く。後で [D] で全文検索すれば一瞬で全部見つかります。