首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C 與 C++ 標準輸入差異:scanf 留存換行符導致的連續讀取問題

     編輯:VC 教學

現象重現

char a, b;
printf("Please input the first character: ");
scanf("%c", &a);
printf("Please input the second character: ");
scanf("%c", &b);   // 直接讀到殘留的 '\n',無等待輸入
printf("The two characters are %c, %c", a, b);

輸入 X Enter 後,第一個 %c 讀到 'X',緩衝區留下 '\n';第二個 %c 直接讀走 '\n',導致程式看起來「跳過」第二次輸入。

正常運作的混合型別讀取

char a; int b;
scanf("%c", &a);   // 讀 'X',留 '\n'
scanf("%d", &b);   // %d 自動跳過空白字元(含 \n),正常等待輸入數字

%d、%f、%s 等格式自動略過前導空白,因此不受殘留換行影響。

解決方案

  1. 在格式字串前加空白:scanf(" %c", &b); —— 空白會吞噬任意數量空白字元。
  2. 呼叫 getchar() 清除殘留:scanf("%c", &a); getchar(); scanf("%c", &b);
  3. 改用 fgets 讀整行再解析:避免掃描函數殘留問題,較健壯。
  4. C++ 使用 std::cin:cin >> a >> b; 同樣自動略過空白。

根本原因

%c 是唯一不略過空白字元的掃描格式,專門用於逐字元讀取(含空白)。其他格式均以空白為分隔符,故會自動跳過。

最佳實務

  • 互動式輸入優先用 fgets/std::getline 讀行,再以 sscanf/stringstream 解析。
  • 必須用 scanf 讀字元時,格式字串前加空白 " %c"。
  • 檢查 scanf 回傳值確認成功賦值個數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved