cin.getline(char* buffer, int n, char delim = '\n');
buffer:目標字元陣列n:最多讀取 n-1 字元(留 1 位給 '\0')delim:結束字元(預設換行符),不存入陣列,但會從流中消耗掉| 操作 | 遇空白 | 遇分隔符 | 指標移動 | 適用型別 |
|---|---|---|---|---|
cin >> str | 停止 | 停止 | 停留在分隔符前 | 所有標準型別 |
cin.get(buf, n, delim) | 包含 | 停止 | 停留在分隔符上 | 僅字元陣列 |
cin.getline(buf, n, delim) | 包含 | 停止 | 移至分隔符後 | 僅字元陣列 |
// 輸入: I like C++./I study C++./I am happy. char ch[20]; cin >> ch; // 只讀 "I" (遇空格停) cin.getline(ch, 20, '/'); // 讀 " like C++." (含前導空格) cin.getline(ch, 20); // 讀 "I study C++./I am h" (19 字元含 '/') // 若第二次也用 '/': 讀 "I study C++."
>> 後接 getline:>> 留下換行符,導致 getline 讀到空行。cin.ignore() 跳過換行符。std::string + std::getline (C++ 標準庫版本)。get 留下分隔符,getline 消耗分隔符。混用時需 ignore() 協調。#includestd::string line; while (std::getline(cin, line)) { // 自動動態擴充,無長度限制 // 處理 line }
標準庫 std::getline 回傳流物件,直接可用於迴圈條件,更安全、更簡潔。
getline 是「讀整行、含空白」的利器,核心在於消耗分隔符、移動指標至後方。理解三種讀取函式的指標行為差異,配合 ignore() 協調混用場景,或直接升級 std::string 版本,能徹底解決輸入解析痛點。