首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言圖書管理系統 scanf 格式化字符串參數不匹配導致訪問違規

     編輯:程式設計綜合問答

典型錯誤

// 結構體
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)。

修正清單

  1. 所有 printf/scanf 格式字符串與參數**逐個對齊檢查**。
  2. scanf 除字符串/數組名外,**所有標量變量必須加 &**。
  3. 優先使用 fgets + sscanf 替代 scanf,避免緩衝區溢出。
  4. 啟用編譯器警告:-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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved