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

C 語言 scanf 後殘留換行符導致 gets 讀空?在 scanf 後加 getchar() 清緩衝區

     編輯:程式設計綜合問答

錯誤程式碼片段

scanf("%d", &y);
// 緩衝區殘留 '\n'
gets(s); // 直接讀到換行符,以為輸入空字串

原因

scanf("%d", &y) 讀取整數後,緩衝區仍保留使用者按下的 Enter(\n)。緊接的 gets(s) 遇到 \n 即視為輸入結束,導致讀到空字串。

修正

scanf("%d", &y);
getchar(); // 吞掉殘留的 '\n'
gets(s);   // 正常等待使用者輸入字串

更佳實踐:棄用 gets,改用 fgets

fgets(s, sizeof(s), stdin);
// 移除結尾換行符
s[strcspn(s, "\n")] = '\0';
  • gets 無緩衝區長度檢查,極易造成緩衝區溢位,C11 標準已移除。
  • fgets 安全、可控制最大讀取長度、保留 \n 方便判斷是否讀完整行。

通用輸入處理模板

int read_int() {
    int v; char buf[64];
    while (1) {
        if (fgets(buf, sizeof(buf), stdin) && sscanf(buf, "%d", &v) == 1) return v;
        fprintf(stderr, "請輸入有效整數:");
    }
}

void read_line(char *buf, size_t sz) {
    if (fgets(buf, sz, stdin)) {
        buf[strcspn(buf, "\n")] = '\0';
    } else {
        buf[0] = '\0';
    }
}

採用「整行讀取 → 解析」模式,徹底避免格式化輸入函式殘留字元的陷阱。

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