| 特性 | std::string | char[] / char* |
|---|---|---|
| 內存管理 | 自動動態分配/釋放 | 固定大小或手動 malloc/free |
| 邊界安全 | 自動擴容,防緩衝區溢出 | 固定長度,超長輸入導致溢出 |
| 操作便利性 | 豐富成員函數 (+, ==, find, substr...) | 需 C 庫函數 (strcpy, strcmp, strlen...) |
| 獲取長度 | s.length() O(1) | strlen(s) O(n) |
| 空值處理 | 空字符串 "" 合法 | 空指針 NULL 易崩潰 |
#include <iostream>
#include <string>
using namespace std;
int main() {
string name, dessert;
cout << "Enter your name:\n";
getline(cin, name); // 自動處理換行、空格
cout << "Enter your favorite dessert:\n";
getline(cin, dessert);
cout << "I have some delicious " << dessert
<< " for you, " << name << ".\n";
return 0;
}
#include <iostream>
using namespace std;
int main() {
const int SIZE = 20;
char name[SIZE], dessert[SIZE];
cout << "Enter your name:\n";
cin.getline(name, SIZE); // 限制讀取長度,防溢出
cout << "Enter your favorite dessert:\n";
cin.getline(dessert, SIZE);
cout << "I have some delicious " << dessert
<< " for you, " << name << ".\n";
return 0;
}
基本輸入輸出功能相同,但 string 更安全、靈活。char[20] 若輸入超過 19 字符(含結束符)會緩衝區溢出,導致未定義行為。
cin.getline vs getline(cin, str)?cin.getline(char*, size):C 風格,讀取指定長度,遇換行停止。getline(istream&, string&):C++ 風格,自動管理內存,讀取整行。char* 接收輸入?// 危險示例
char *name = new char[20];
cin >> name; // 若輸入超過 19 字符,堆內存溢出,程序崩潰或被攻擊
std::string:現代 C++ 標準庫核心組件,性能優化良好(SSO 小字符串優化)。char*:調用 c_str() 或 data() 獲取只讀指針。new char[]、strcpy、strlen 等易錯操作。C++ 參考權威站:std::string::getline