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

C++ 控制台輸入:為何 Ctrl+Z 無法結束、空格被忽略及正確讀取整行的方法

     編輯:程式設計綜合問答

問題代碼

char ch;
string s;
while (cin >> ch)
    s.push_back(ch);
cout << s;

三個疑問:
1. 為何 Ctrl+Z 不能結束輸入?C++ 的檔案結束符是什麼?
2. 改成 cin >> ch && ch != '1' 後輸入 hello world1,輸出變成 helloworld,空格去哪了?
3. 如何正確讀取包含空格的整行?

解答

1. Windows 控制台的 EOF 是 Ctrl+Z,但需獨佔一行

  • 在新行開頭輸入 Ctrl+Z 再按 Enter,cin 才會進入失敗狀態結束迴圈。
  • 若在行中間輸入 Ctrl+Z,系統視為字元 0x1A 而非 EOF。
  • Linux/macOS 使用 Ctrl+D(同樣需獨佔一行)。

2. operator>> 會跳過空白字元(空格、換行、Tab)

  • cin >> ch 讀取的是非空白字元,空格被丟棄,所以 hello world 變成 helloworld。
  • 這是格式化輸入的預設行為。

3. 正確讀取整行(含空格)的方法

// 方法一:getline(最常用)
string line;
while (getline(cin, line)) {
    cout << line << '\n';
}

// 方法二:cin.get() 逐字元讀取(保留空格)
char ch;
while (cin.get(ch)) { // 回傳 istream&,隱性轉 bool 判斷狀態
    cout << ch;
}

// 方法三:noskipws 操控子(讓 operator>> 不跳過空白)
cin >> noskipws;
char c;
while (cin >> c) { /* ... */ }

總結

  • EOF 需在行首輸入 Ctrl+Z/D + Enter。
  • cin >> ch 會吞掉空格,需用 getline 或 cin.get() 讀取完整行。
  • 理解串流格式化與非格式化輸入的差異,是 C++ 控制台程式的基本功。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved