典型錯誤
// 結構體
struct Book { char isbn[20], name[50], writer[50], publisher[50]; int num; float price; };
// 輸出時
printf("%s\t%s\t%s\t%s\t%d\t%f",
book.isbn, book.name, book.writer, book.publisher, book.num, book.price);
// 缺少 writer 參數!實際傳 5 個,格式串 6 個佔位符
// 輸入時
scanf("%s %s %s %s %d %f",
book.isbn, book.name, book.writer, book.publisher, &book.num, &book.price);
// price 是 float,需 &book.price
後果
printf 參數少於佔位符 → 讀取棧上垃圾值 → 輸出亂碼,嚴重時棧破壞導致後續崩潰。
scanf 缺少 & → 寫入錯誤地址 → 訪問違規 (0xC0000005)。
修正清單
- 所有
printf/scanf 格式字符串與參數**逐個對齊檢查**。
scanf 除字符串/數組名外,**所有標量變量必須加 &**。
- 優先使用
fgets + sscanf 替代 scanf,避免緩衝區溢出。
- 啟用編譯器警告:
-Wformat -Wformat-security (GCC/Clang) 或 /W4 (MSVC)。
示例修正
// 輸出
printf("%s\t%s\t%s\t%s\t%d\t%.2f\n",
b.isbn, b.name, b.writer, b.publisher, b.num, b.price);
// 輸入 (用 fgets 讀整行再解析)
char line[256];
fgets(line, sizeof(line), stdin);
sscanf(line, "%19s %49s %49s %49s %d %f",
b.isbn, b.name, b.writer, b.publisher, &b.num, &b.price);