# 自訂輸入 ## **1. 基本輸入 (`cin`)** `cin` 是 `C++` 中最常用的輸入方式,適用於單一變數或多個變數的輸入。 ```cpp= #include <iostream> using namespace std; int main() { int age; cout << "請輸入你的年齡: "; cin >> age; cout << "你的年齡是: " << age << endl; return 0; } ``` 🔹 **注意**:`cin` 預設以 **空格、Tab 或換行** 作為分隔符號。要記得喔!! --- ## **2. 讀取整行輸入 (`getline()`)** `getline()` 用來讀取一整行輸入,**包括空格**。 ```cpp= #include <iostream> using namespace std; int main() { string name; cout << "輸入你的名字: "; getline(cin, name); cout << "HI, " << name << "!" << endl; return 0; } ``` ### 注意 **當使用 `cin` 讀取數字後,緊接著用 `getline()` 讀取字串時,會出現問題,需要加 `cin.ignore()` 清除換行符。** ```cpp= #include <iostream> using namespace std; int main() { int age; string name; cout << "請輸入年齡: "; cin >> age; cin.ignore(); // 清除換行符 cout << "請輸入名字: "; getline(cin, name); cout << "年齡: " << age << ", 名字: " << name << endl; return 0; } ``` --- ## **3. 使用 `stringstream` 解析輸入** `stringstream` 允許將字串當作輸入流來解析。 ```cpp= #include <iostream> #include <sstream> using namespace std; int main() { string input = "Alice 25"; stringstream ss(input); string name; int age; ss >> name >> age; cout << "名字: " << name << ",年齡: " << age << endl; return 0; } ``` 🔹 **可以搭配 `getline()` 和 `stringstream` 解析自訂格式的輸入。** ```cpp= #include <iostream> #include <sstream> using namespace std; int main() { string input = "is always a country.no one can ruin,114,Taiwan"; stringstream ss(input); string OO, country; int age; getline(ss, OO, ','); //以 , 符號做分隔 string ageStr; getline(ss, ageStr, ','); age = stoi(ageStr); //這是字串轉數值函式 getline(ss, country, ','); cout << "國家: " << country << ",年齡: " << age << ",我想說: " << OO << endl; return 0; } ``` --- ## **4. 自訂格式的輸入** ### **(1) 解析含有特殊分隔符的輸入** 有時候輸入的數據格式不是標準的**空格分隔**,可以使用 `getline()` 來處理。 ```cpp= #include <iostream> #include <sstream> using namespace std; int main() { string input = "100|200|300"; stringstream ss(input); string token; while (getline(ss, token, '|')) { cout << "數字: " << token << endl; } return 0; } ``` **輸出:** ``` 數字: 100 數字: 200 數字: 300 ``` --- ### **(2) 自訂格式化數據輸入** 使用 `scanf` 或 `cin` 搭配格式化輸入,例如解析 `YYYY/MM/DD` 日期格式。不一定要使用 `getliine` ```cpp= #include <iostream> using namespace std; int main() { int year, month, day; char slash; cout << "請輸入日期 (YYYY/MM/DD): "; cin >> year >> slash >> month >> slash >> day; cout << year << "年 " << month " 月 " << day << " 日" << endl; return 0; } ``` **輸入範例:** ``` 2024/03/23 ``` **輸出:** ``` 2024年 3月 23日 ``` --- ## **5. `cin` 的錯誤處理** 如果使用者輸入了錯誤的數據類型,`cin` 可能會進入錯誤狀態。 ```cpp= #include <iostream> using namespace std; int main() { int number; cout << "請輸入一個整數: "; cin >> number; if (cin.fail()) { // 檢查 cin 是否有發生錯誤 cout << "輸入錯誤! 請輸入數字。" << endl; cin.clear(); // 清除錯誤狀態 cin.ignore(1000, '\n'); // 忽略錯誤輸入,最多忽略1000個字元,然後直到遇到\n停止 } else { cout << "你輸入的數字是: " << number << endl; } return 0; } ``` 🔹 `cin.fail()` **檢查輸入是否錯誤**,如果錯誤,就使用 `cin.clear()` 清除錯誤狀態,然後 `cin.ignore()` 忽略錯誤輸入。 --- ## **6. 進階應用:多行輸入與動態處理** 如果要處理 **多行輸入**,可以用 `while (getline(cin, line))` 來讀取。 ```cpp #include <iostream> using namespace std; int main() { string line; cout << "請輸入多行文字 (輸入 0 結束):" << endl; while (getline(cin, line)) { if (line == "0") break; //注意,這裡的0是字串,所以要用" "包起來喔!!! cout << "你輸入的內容: " << line << endl; } return 0; } ``` **輸入範例:** ``` Hello kurumi 是最可愛的! 0 ``` **輸出:** ``` 你輸入的內容: Hello 你輸入的內容: kurumi 是最可愛的! ``` ## 小結 以上的所有操作對於很多字串處理的題目都有很大的功效,超好用的。 雖然 `scanf` 也有很多好用的語法,但是我不是很熟(所以我講義才拖這麼久才出XDD),如果有興趣,務必上網查查,多學會一種方式也不差,對吧。