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

C 語言圖書管理系統輸入函數 Bug 修復:緩衝區殘留換行符導致 gets 跳過

     編輯:程式設計綜合問答

問題現象

輸入第一本書資料正常,輸入第二本時 gets(newbook.name) 直接跳過,顯示亂碼或空值(如圖所示)。

根本原因

scanf("%f", &newbook.price) 讀取浮點數後,緩衝區殘留 \n(換行符)。後續 gets() 讀到該換行符即以為輸入結束,導致跳過輸入。

修復方案

在每次 scanf 後、下一次 gets 前,加一個 getchar() 吸收殘留換行符:

printf("輸入圖書單價(小數點後一位):");
scanf("%f", &newbook.price);
getchar();  // 關鍵:吃掉緩衝區殘留的 \n

完善建議

  • 主函數改為 int main() 並 return 0;,符合 C 標準。
  • 避免使用危險的 gets()(C11 已移除),改用 fgets(newbook.name, sizeof(newbook.name), stdin) 並手動去除尾部 \n。
  • 字串比較 newbook.lendername == "\r" 錯誤,應用 strcmp(newbook.lendername, "") == 0 判斷空字串。
  • 檔案模式 "w" 會覆蓋,若需追加記錄請用 "ab"(二進位追加)或 "a+"。

修正後關鍵片段

void choice_1_input_new() {
    // ...
    while (1) {
        // ...
        scanf("%f", &newbook.price);
        getchar();  // 吸收換行
        // 其餘 scanf 同理加 getchar()
        // ...
        // 判斷是否借出
        if (strlen(newbook.lendername) == 0)  // 正確判斷空字串
            newbook.isExit = 1;
        else
            newbook.isExit = 0;
        // ...
    }
}

修復緩衝區殘留換行符,輸入流程即可正常循環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved