字符串處理看似簡單,實則暗藏玄機。本文通過實例深度剖析 C++ 中字符數組與字符串輸入的常見陷阱,涵蓋 strlen 行為、空字符截斷、cin 空白截斷問題、getline/get 換行符處理差異、混合輸入時的緩衝區殘留換行符問題等核心知識點。
'\0',遇到首個空字符即停止統計char name[16] = "abcdefg";
cout << name << endl; // 輸出: abcdefg
name[3] = '\0'; // 在第4個位置植入空字符
cout << name << endl; // 輸出: abc (後續字符被隱藏)
原理:C 風格字符串以 '\0' 為結束標誌,輸出流遇到空字符即停止,即使數組中仍有數據。
char name[20], dessert[20];
cin >> name; // 輸入 "Meng Liang"
cin >> dessert; // 期望輸入甜點名

cin 以空白字符(空格、制表符、換行符)作為字符串邊界cin 僅讀取 "Meng" 存入 name,"Liang" 殘留在輸入緩衝區cin >> dessert 直接從緩衝區讀取 "Liang",導致甜點名輸入被跳過cin.getline(name, ArSize); // 讀取整行,丟棄換行符
cin.getline(dessert, ArSize);

| 函數 | 讀取方式 | 換行符處理 | 適用場景 |
|---|---|---|---|
cin >> | 單詞(遇空白停止) | 保留在緩衝區 | 單詞輸入 |
getline() | 整行(遇換行停止) | 丟棄換行符 | 包含空格的完整行輸入 |
get() | 整行(遇換行停止) | 保留換行符在緩衝區 | 需手動處理換行符場景 |
int year;
cin >> year; // 輸入 2013 並按回車
cin.getline(address, 80); // 期望輸入地址

地址還沒輸入程序就結束了!
cin >> year 讀取數值後,換行符殘留在輸入緩衝區。隨後 getline 讀到這個換行符以為是空行,直接返回。
// 方案1:單獨讀取並丟棄換行符
cin >> year;
cin.get(); // 或 cin.ignore();
// 方案2:利用鏈式調用 (cin >> year).get();
strlen 看字符,sizeof 看數組字節數'\0' 實現字符串截斷cin >> ,整行用 getline>>)後緊跟行輸入(getline)時,必須清理緩衝區殘留換行符std::string 配合 std::getline,避免手動管理字符數組與緩衝區本文出自 “_Liang_Happy_Life__Dream” 博客,轉載請保留出處:原文鏈接