# 自訂輸入
## **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),如果有興趣,務必上網查查,多學會一種方式也不差,對吧。