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

C 語言 scanf 回傳值行為差異:為何 1.2 導致迴圈終止

     編輯:程式設計疑難解答

現象

int b; char c;
scanf("%d", &b);
scanf("%c", &c);
printf("%d %c", b, c);

輸入 1.2 時,第一個 %d 讀取 1,緩衝區殘留 .2\n。第二個 %c 讀取 .,而非預期的換行符。

while 迴圈終止原因

while (scanf("%d", &b) == 1) { ... }

輸入 1.2:

  1. 第一次迴圈:%d 成功匹配 1,回傳 1,迴圈繼續。緩衝區剩 .2\n。
  2. 第二次迴圈:%d 嘗試匹配整數,遇到 . 失敗,回傳 0,迴圈條件 ==1 為假,**迴圈終止**。緩衝區仍殘留 .2\n,導致後續讀取失敗。

對比:單次 scanf 配合 printf

a = scanf("%d", &b);
printf("%d", a); // 輸入 1.2 也輸出 1,但程式結束,無後續讀取問題

解決方案

  1. 清理緩衝區:讀取整數後,呼叫 while (getchar() != '\n'); 吞掉殘留字元。
  2. 改用 fgets + sscanf:逐行讀取完整字串再解析,避免緩衝區殘留問題。
    char line[100];
    while (fgets(line, sizeof(line), stdin)) {
        if (sscanf(line, "%d", &b) == 1) {
            // 成功解析整數
        }
    }
  3. 檢查 scanf 回傳值:0 表示匹配失敗,EOF 表示輸入結束,>0 表示成功匹配項數。

最佳實踐

  • 互動式輸入優先使用 fgets 讀整行,再用 sscanf 或 strtol 解析。
  • 若必須用 scanf,每次呼叫後檢查回傳值,失敗時清理緩衝區。
  • 格式字串 "%d" 會跳過前導空白,但 不會跳過非數字字元(如 .、a)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved