程式碼中 char type[10] 改為 std::string type 後,scanf("%s%d%d", type, &x, &y) 編譯/運行錯誤。
scanf 是 C 標準庫函式,只支援 C 風格字串 (char*),不支援 C++ std::string。std::string 是類別封裝,記憶體佈局與 char* 不相容,無法直接作為 %s 目標緩衝區。
char type[10];
scanf("%9s%d%d", type, &x, &y); // %9s 防緩衝區溢出
// 使用時
if (type[0] == 'A') { ... }
#include
#include
using namespace std;
string type;
cin >> type >> x >> y; // 自動處理 string 讀取、空白分隔
// 使用時
if (type[0] == 'A') { ... } // string 支援 [] 存取字元
char buffer[10];
scanf("%9s", buffer);
string type = buffer; // 隱式轉換
| 特性 | char type[10] | std::string type |
|---|---|---|
| 記憶體管理 | 固定棧上陣列,手動管理 | 動態堆上分配,RAII 自動管理 |
| 長度限制 | 固定 9 字元 + '\0' | 動態擴充,理論無上限 |
| 安全性 | 易緩衝區溢出 | 邊界檢查 (at())、異常安全 |
| 功能豐富度 | 需手寫/庫函式操作 | 豐富成員函式 (find, substr, +, == 等) |
| C 函式相容 | 直接相容 | 需 .c_str() 或 data() |
| 效能 | 極快 (無分配) | 略慢 (小字串優化 SSO 可忽略) |
string.c_str() (唯讀) 或 &string[0] (C++11 連續記憶體) 轉換。char buf[SIZE] + scanf/printf 或快速 IO 模板。%9s 防溢出,%s 不安全。理解 scanf 僅支援 C 字串,std::string 是 C++ 類別,兩者不可直接互換,是 C/C++ 混合編程的基本認知。