---
# System prepended metadata

title: C++_自訂輸入

---

# 自訂輸入

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