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

C 語言月份天數統計程序 Bug:fgets 讀取換行符導致字符串比較失敗

     編輯:程式設計綜合問答

問題代碼片段

while (fgets(input, 100, stdin) != NULL && input[0] != '\0') {
    daytotal = days(input);  // input 包含末尾 '\n'
    // strcmp(input, "march") 永遠不相等
}

根本原因

fgets 會將換行符 \n 讀入緩衝區(若空間足夠)。用戶輸入 march 後按 Enter,input 實際為 "march\n",與數組中 "march" 比較失敗,導致函數返回 -1。

修正方案

  1. 移除換行符(推薦):
    input[strcspn(input, "\n")] = '\0';  // 安全截斷換行
       
  2. 改用 scanf 或 gets(不推薦):
    scanf("%9s", input);  // 自動跳過空白,不含換行,但有緩衝區溢出風險
       // gets(input);  // C11 已移除,極度不安全
       
  3. 比較時忽略換行:
    if (strncmp(input, month.name, strlen(month.name)) == 0 && input[strlen(month.name)] == '\n')
       

完善後的輸入循環

while (fgets(input, sizeof(input), stdin)) {
    input[strcspn(input, "\n")] = '\0';  // 去換行
    if (input[0] == '\0') break;         // 空行退出
    daytotal = days(input);
    // ...
}

補充建議

  • days 函數中 tolower 修改了傳入緩衝區,若後續需原始輸入請先複製。
  • 結構體數組 months 可定為 const 防止意外修改。
  • 主函數返回類型應為 int,並 return 0;。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved