在 C++ 標準輸入處理中,cin.get() 與 cin.getline() 都是常用的字符讀取函數,但它們對換行符 '\n' 的處理方式截然不同,直接影響後續輸入操作。本文從三種輸入情況深入分析兩者差異。
函數原型
istream& get(char* s, streamsize n):讀取至 '\n' 或 n-1 字符,保留換行符在緩衝區。
istream& getline(char* s, streamsize n):讀取至 '\n' 或 n-1 字符,提取並丟棄換行符。
情況一:輸入長度未超過限定大小
| 函數 | 行為 | 對後續輸入影響 |
get() | 讀取所有字符,遇 '\n' 停止,換行符留在緩衝區 | 下一個讀取操作會先捕獲此換行符,導致提前結束 |
getline() | 讀取所有字符,遇 '\n' 停止,換行符被提取並丟棄 | 不影響後續輸入,緩衝區乾淨 |
情況二:輸入長度超過限定大小 (Size)
| 函數 | 行為 | 狀態標誌 | 後果 |
get() | 讀取 Size-1 字符,補 '\0',剩餘字符(含 '\n')留在緩衝區 | 正常 | 下一次讀取會獲得剩餘內容 |
getline() | 讀取 Size-1 字符,補 '\0',剩餘字符留在緩衝區 | 設置 failbit (即 !cin 為真) | 後續所有輸入操作失效,需 cin.clear() 重置才能繼續 |
情況三:輸入空行(直接按 Enter)
| 函數 | 結果字符串 | 狀態標誌 | 換行符處理 |
get() | '\0' (空字符串) | 設置 failbit | 留在緩衝區,clear() 後下次讀取會捕獲 |
getline() | '\0' (空字符串) | 正常 (不設置 failbit) | 被提取並丟棄 |
使用建議
- 推薦
getline():處理整行輸入,自動清理換行符,避免殘留干擾後續 cin >> var 等操作。
- 若用
get(),後續務必加 cin.ignore() 清除殘留換行符。
- 大數據輸入時,
getline() 觸發 failbit 需顯式 clear() 恢復流狀態。
代碼示範
char buf[20];
cin.getline(buf, 20); // 讀取一行,自動丟棄 \n
cout << buf << endl;
cin.get(buf, 20); // 讀取下一行,但 \n 留在緩衝區
cin.ignore(); // 必須手動忽略 \n
cout << buf << endl;
理解這些細節能有效避免「輸入被跳過」「讀到空行」等常見坑點。