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

C++ 處理未知長度字符串輸入:scanf 遺留換行符導致 cin.get 跳過的解決方法

     編輯:程式設計疑難解答

問題代碼

scanf("%d", &time);  // 讀取整數
while ((temp = cin.get()) != '\n') {  // 企圖讀取整行字符串
    str += temp;
}

現象:循環直接結束,cin.get() 讀到的是 scanf 遺留在緩沖區的換行符 '\n'。

原因

scanf("%d", &time) 讀取數字後,緩沖區仍保留用戶按下的回車符(\n)。隨後 cin.get() 讀取該殘留換行符,滿足循環結束條件,導致實際字符串輸入被跳過。

解決方法

方法一:清空緩沖區(C 風格)

scanf("%d", &time);
fflush(stdin);  // Windows/MSVC 有效,非標準
// 或跨平台:
int c;
while ((c = getchar()) != '\n' && c != EOF);

方法二:C++ 風格忽略換行

cin.ignore(numeric_limits::max(), '\n'); // 需 #include 

方法三:統一使用 C++ 流

int time;
cin >> time;
cin.ignore(); // 忽略單個換行符
string str;
getline(cin, str); // 直接讀取整行

建議

項目中統一使用 C++ iostream(cin/cout/getline),避免混用 C 的 scanf/printf 導致緩沖區同步問題。

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