首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 字符串與數組輸入深度解析:strlen、cin、getline 陷阱全攻略

     編輯:關於C語言

字符串處理看似簡單,實則暗藏玄機。本文通過實例深度剖析 C++ 中字符數組與字符串輸入的常見陷阱,涵蓋 strlen 行為、空字符截斷、cin 空白截斷問題、getline/get 換行符處理差異、混合輸入時的緩衝區殘留換行符問題等核心知識點。

一、 strlen 核心特性

  • 返回字符串實際長度(可見字符數),而非數組分配大小
  • 不計算結束標誌 '\0',遇到首個空字符即停止統計

二、 空字符截斷演示

char name[16] = "abcdefg";
cout << name << endl;        // 輸出: abcdefg
name[3] = '\0';              // 在第4個位置植入空字符
cout << name << endl;        // 輸出: abc (後續字符被隱藏)

原理:C 風格字符串以 '\0' 為結束標誌,輸出流遇到空字符即停止,即使數組中仍有數據。

三、 cin 輸入的空白截斷陷阱

問題代碼

char name[20], dessert[20];
cin >> name;      // 輸入 "Meng Liang"
cin >> dessert;   // 期望輸入甜點名

運行結果

cin 空白截斷演示

原因分析

  • cin 以空白字符(空格、制表符、換行符)作為字符串邊界
  • 首次輸入 "Meng Liang" 時,cin 僅讀取 "Meng" 存入 name,"Liang" 殘留在輸入緩衝區
  • 第二次 cin >> dessert 直接從緩衝區讀取 "Liang",導致甜點名輸入被跳過

四、 getline 與 get 解決方案

getline 版本

cin.getline(name, ArSize);   // 讀取整行,丟棄換行符
cin.getline(dessert, ArSize);

getline 正確讀取整行

關鍵差異

函數讀取方式換行符處理適用場景
cin >> 單詞(遇空白停止)保留在緩衝區單詞輸入
getline()整行(遇換行停止)丟棄換行符包含空格的完整行輸入
get()整行(遇換行停止)保留換行符在緩衝區需手動處理換行符場景

五、 混合輸入的經典坑:數值輸入後接 getline

問題代碼

int year;
cin >> year;              // 輸入 2013 並按回車
cin.getline(address, 80); // 期望輸入地址

現象

地址輸入被跳過

地址還沒輸入程序就結束了!

根本原因

cin >> year 讀取數值後,換行符殘留在輸入緩衝區。隨後 getline 讀到這個換行符以為是空行,直接返回。

兩種解決方案

// 方案1:單獨讀取並丟棄換行符
cin >> year;
cin.get();  // 或 cin.ignore();

// 方案2:利用鏈式調用 (cin >> year).get();

六、 總結與最佳實踐

  1. 字符串長度:strlen 看字符,sizeof 看數組字節數
  2. 空字符控制:可通過索引賦值 '\0' 實現字符串截斷
  3. 輸入選擇:單詞用 cin >> ,整行用 getline
  4. 混合輸入:格式化輸入(>>)後緊跟行輸入(getline)時,必須清理緩衝區殘留換行符
  5. 現代 C++ 建議:優先使用 std::string 配合 std::getline,避免手動管理字符數組與緩衝區

本文出自 “_Liang_Happy_Life__Dream” 博客,轉載請保留出處:原文鏈接

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved