C++數組與字符串:從基礎到實戰技巧

C++中的數組和字符串是處理數據集合和文本的基礎工具。數組用于存儲相同類型的元素集合,而字符串則專門用于處理文本數據。C++提供了兩種主要的字符串處理方式:C風格字符串(字符數組)和C++的std::string類。

📊 1. 數組 (Arrays)

數組是相同類型元素的集合,這些元素在內存中連續存儲。數組的大小在定義時確定,且不能改變。

一維數組

  • 聲明與初始化

    數組的聲明需要指定元素類型、數組名和大小。初始化可以在聲明時進行。

    int numbers[5];// 聲明一個包含5個整數的數組,未初始化int numbers[5] = {1, 2, 3, 4, 5};// 聲明并初始化int numbers[] = {1, 2, 3, 4, 5};// 編譯器自動計算大小

    如果初始化值少于數組元素,剩余元素會自動初始化為0(對于基本數據類型)

  • 訪問元素

    通過索引訪問數組元素,索引從0開始。

    int first = numbers[0];// 訪問第一個元素
    numbers[4] = 10;// 修改第五個元素
  • 特點

    • 內存連續,訪問高效。
    • 大小固定,無法動態擴容。
    • 需注意數組越界訪問,這可能引發未定義行為。

多維數組

多維數組,如二維數組,可視為“數組的數組”,常用于表示矩陣或表格。

  • 聲明與初始化

    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};// 2行3列int matrix[2][3] = {1, 2, 3, 4, 5, 6};// 按順序初始化
  • 訪問元素

    使用多個索引訪問元素。

    int value = matrix[1][2];// 訪問第二行第三列(值為6)

動態數組

使用newdelete[]在堆上動態分配和釋放內存。

int size = 5;
int* dynamicArray = new int[size];// 動態分配// 使用 dynamicArray...delete[] dynamicArray;// 釋放內存

動態數組需手動管理內存,防止內存泄漏。

🔤 2. 字符串 (Strings)

C++中有兩種主要的字符串表示方式:C風格字符串和std::string類。

C風格字符串 (C-Style Strings)

C風格字符串本質是以空字符'\0'結尾的字符數組

  • 聲明與初始化

    char str1[] = "Hello";// 編譯器自動添加'\0',數組長度為6char str2[6] = {'H', 'e', 'l', 'l', 'o', '\0'};// 手動添加終止符

    字符串字面量用雙引號括起,編譯器會自動在其末尾添加空字符

  • 常用函數

    使用C標準庫函數(需包含<cstring>)進行操作:

    #include <cstring>char str1[20] = "Hello";
    char str2[] = "World";strlen(str1);// 獲取字符串長度(不包括'\0')strcpy(str1, str2);// 復制字符串(需確保目標空間足夠)strcat(str1, "!");// 連接字符串(需確保目標空間足夠)strcmp(str1, "Hello World!");// 比較字符串(相等返回0)

    注意:使用strcpystrcat等函數時,必須確保目標字符數組有足夠的空間,否則可能導致緩沖區溢出

std::string類

C++標準庫提供的std::string類(需包含<string>頭文件)封裝了字符串操作,自動管理內存,更安全便捷

  • 聲明與初始化

    #include <string>
    std::string s1;// 空字符串
    std::string s2 = "Hello, World!";// 初始化std::string s3(s2);// 拷貝構造
  • 常用操作

    std::string支持豐富的操作:

    s1 = "Hello"; s2 = "World";
    std::string s4 = s1 + ", " + s2;// 字符串拼接(使用+運算符)
    s1.append(" World!");// 追加字符串int len = s1.length();// 或 s1.size(),獲取字符串長度char ch = s1[0];// 通過索引訪問字符(不檢查邊界)
    ch = s1.at(0);// 使用at()訪問(會檢查邊界,越界拋出異常)std::string sub = s1.substr(7, 5);// 提取子串(從位置7開始,長度為5)size_t pos = s1.find("World");// 查找子串,返回首次出現的位置(未找到返回std::string::npos)
    s1.replace(7, 5, "C++");// 替換子串(從位置7開始,替換5個字符為"C++")
    s1.insert(7, "Beautiful ");// 插入字符串
    s1.erase(7, 10);// 刪除子串(從位置7開始,刪除10個字符)if (s1 == s2) {/* 比較字符串 */ }// 支持關系運算符比較
  • 輸入輸出

    使用getline讀取整行文本(包括空格):

    std::string name;
    std::cout << "Enter your full name: ";
    std::getline(std::cin, name);// 讀取整行
    std::cout << "Hello, " << name << std::endl;

    使用cin進行輸入時,遇到空格、制表符或換行符會停止讀取

轉換

  • std::string與 C風格字符串互轉

    std::string s = "Hello";
    const char* cstr1 = s.c_str();// 轉換為C風格字符串(只讀,指向s的內部數據)const char* cstr2 = s.data();// C++17前與c_str()類似,C++17起可能不以空字符結尾char arr[20];
    std::strcpy(arr, s.c_str());// 將s的內容復制到可修改的字符數組arr中const char* cstr = "World";
    std::string s_from_c = cstr;// C風格字符串轉換為std::string

    注意:c_str()返回的指針在std::string對象發生修改后可能失效

?? 3. 對比與選擇

特性C風格字符串std::string
內存管理手動管理,易出錯自動管理,避免泄漏
安全性易緩沖區溢出/越界更安全,邊界檢查
功能基礎函數(strlen, strcpy等)豐富方法(拼接、查找、替換等)
性能開銷小,適合底層或嵌入式動態擴容可能帶來開銷,但通常更便捷

建議:在現代C++開發中,優先使用std::string,除非在與C代碼交互或對性能有極端要求的場景下才考慮使用C風格字符串

💡 4. 注意事項

  1. 數組越界:訪問數組時,確保索引在[0, size-1]范圍內,越界訪問會導致未定義行為。
  2. 字符串結束符:操作C風格字符串時,務必確保其以'\0'結尾,否則相關字符串函數可能無法正常工作甚至導致程序崩潰。
  3. 空間充足:對C風格字符串進行拼接、復制等操作前,務必確認目標字符數組有足夠的空間,防止緩沖區溢出。
  4. std::stringc_str():不要存儲c_str()返回的指針并在后續修改std::string對象,除非已重新獲取。該指針指向的數據可能在std::string修改后失效。

掌握數組和字符串的基礎知識是進行有效C++開發的關鍵。根據具體場景選擇合適的工具,并始終牢記安全操作的準則。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922361.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

艾邁斯歐司朗推出首款高功率多芯片激光器封裝

在投影顯示領域掀起技術革新的浪潮中&#xff0c;艾邁斯歐司朗猶如一位技藝精湛的工匠&#xff0c;精心打造出Vegalas Power系列高功率激光二極管的首顆明珠——PLPM7_455QA激光器。這款采用多顆GaN基功率激光器集成封裝的新品&#xff0c;在短脈沖周期內綻放出42W的璀璨光芒&a…

機器視覺中的工業相機接口該如何選擇?

工業相機接口&#xff1a;數據傳輸的“高速公路”&#xff0c;選對了才夠快 在機器視覺系統里&#xff0c;工業相機就像“眼睛”&#xff0c;而接口則是連接“眼睛”與“大腦”&#xff08;后端處理系統&#xff09;的“高速公路”。這條“路”的寬窄、長短、抗干擾能力&#x…

[數據結構——lesson10.2堆排序以及TopK問題]

目錄 前言 學習目標 堆排序 TopK問題&#xff1a; 解法一&#xff1a;建立N個數的堆 解法二&#xff1a;建立K個數的堆&#xff08;最優解&#xff09; 完整代碼 結束語 前言 上節內容我們詳細講解了堆[數據結構——lesson10.堆及堆的調整算法]&#xff0c;接下來我們…

使用HTTPS 服務在瀏覽器端使用攝像頭的方式解析

1.方式1 // vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import basicSsl from vitejs/plugin-basic-sslexport default defineConfig({plugins: [vue(),basicSsl({name: test,domains: [192.168.15.166, localhost], // 添加您的IPc…

上下文管理器和異步I/O

目錄 一、上下文管理器 1.1 定義 1.2 特點 1.3 適用場景 1.4 具體實現 1.5 具體實例 1.5.1 文件管理器 1.5.2 線程鎖釋放資源 二、異步I/O 2.1 定義 2.2 特點 2.3 實現方式 2.4 適用場景 高并發網絡服務&#xff1a;Web服務器、API服務等需要處理大量并發連接 2…

LabVIEW信號監測與分析

借助 LabVIEW 平臺&#xff0c;生成含正弦波與噪聲的信號&#xff0c;經頻譜分析等處理&#xff0c;結合動態限值判斷信號是否超限&#xff0c;廣泛用于音頻、振動等領域的信號監測&#xff0c;助力高效開展信號分析與質量把控。概念說明系統圍繞信號的生成、處理、分析及監測展…

MySQL數據庫與表的創建、修改及數據操作指南

精選專欄鏈接 &#x1f517; MySQL技術筆記專欄Redis技術筆記專欄大模型搭建專欄Python學習筆記專欄深度學習算法專欄 歡迎訂閱&#xff0c;點贊&#xff0b;關注&#xff0c;每日精進1%&#xff0c;與百萬開發者共攀技術珠峰 更多內容持續更新中&#xff01;希望能給大家帶來…

?new species of flying reptile1 discovered in Scotland?

Pterosaur: new species of flying reptile1 discovered in Scotland 蘇格蘭斯凱島發現新翼龍物種 考古學家們在蘇格蘭斯凱島發現了一個新的翼龍物種。這種獨特的飛行爬行動物生活在1.68 – 1.66億年前。 This flying reptile soared over the heads of dinosaurs2 when Scotla…

03 節點行為

審批流程圖如下圖&#xff0c;在此流程圖中&#xff0c;存在兩個UserTask節點&#xff0c;第一個節點是主管審批&#xff0c;第二個節點是產品經理審批&#xff0c;兩個節點中間有一個排他網關&#xff0c;此網關用來對主管審批的結果進行判斷&#xff0c;如果主管審批通過&…

深度卷積生成對抗網絡詳解與實現

深度卷積生成對抗網絡詳解與實現 0. 前言 1. 網絡架構 1.1 批歸一化 1.2 激活 1.3 上采樣 2. 構建 DCGAN 2.1 生成器 2.2 判別器 2.3 訓練 DCGAN 0. 前言 深度卷積生成對抗網絡 (Deep Convolutional Generative Adversarial Network, DCGAN) 是基于生成對抗網絡 (Generative A…

CF607B Zuma -提高+/省選-

CF607B Zuma codeforces 原鏈接 題目描述 Genos\texttt{Genos}Genos 最近在他的手機上下載了祖瑪游戲。在祖瑪游戲里&#xff0c;存在 nnn 個一行的寶石&#xff0c;第 iii 個寶石的顏色是 CiC_iCi?。這個游戲的目標是盡快的消滅一行中所有的寶石。 在一秒鐘&#xff0c;Ge…

拆分了解HashMap的數據結構

文章目錄 前言 一、底層數據結構總覽 二、核心組成部分詳解 1. 數組&#xff08;哈希表&#xff09; 2. 節點&#xff08;Node&#xff09; 3. 紅黑樹&#xff08;TreeNode&#xff09; 三、哈希函數與索引計算 四、哈希沖突的解決 五、擴容機制 六、關鍵特性與注意事…

關于電腦連接不到5g的WiFi時的一些解決辦法

方法一、設備管理器重卸載驅動后&#xff0c;重裝驅動。方法二、打開控制面板 “控制面板\網絡和 Internet\網絡連接” &#xff08;親測有效&#xff09;點擊更改適配器配置右擊當前的WLAN屬性點擊配置選擇“高級” 802.11a/b/g 無線模式選項欄 值&#xff1a;6.的雙…

Mathtype公式批量編號一鍵設置公式居中編號右對齊

插件[ygtools] 批量編號一鍵設置公式居中編號右對齊 單欄/多欄均可https://wwon.lanzout.com/i0NRf35vyw8j 下載密碼8543

基于ssm的小橘子出行客戶體驗評價系統[SSM]-計算機畢業設計源碼+LW文檔

摘要&#xff1a;隨著出行行業的快速發展&#xff0c;客戶體驗評價對于出行服務質量的提升至關重要。本文設計并實現了基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的小橘子出行客戶體驗評價系統。該系統涵蓋系統用戶管理、司機信息管理、客戶評價管理等功…

算法日記---二分查找

目錄 前言 一、二分查找 1.思想 2.簡單二分 3.優點 4.局限性 二、模板 1.基本模板 2.簡單例題&#xff08;LeetCode&#xff09; 4.有重復元素的二分 5.0-1問題 總結 前言 本文通過講解簡單的二分查找配合leetcode例題對二分查找本質、模板進行了基礎的總結 提示&a…

Level Set(水平集)算法——形象化講解

目錄 維度一&#xff1a;核心思想與比喻&#xff08;它像什么&#xff1f;&#xff09; 維度二&#xff1a;要解決什么問題&#xff1f;&#xff08;它能干嘛&#xff1f;有什么用&#xff1f;&#xff09; 維度三&#xff1a;工作原理&#xff08;它是怎么做到的&#xff1…

DDoS 攻防“軍備競賽”的幕后

談到 DDoS&#xff08;分布式拒絕服務攻擊&#xff09;&#xff0c;很多人會想到“黑客租用肉雞發流量&#xff0c;網站直接崩”。但事實上&#xff0c;如今的 DDoS 攻防早已變成一場 軍備競賽。攻擊者的武器越來越“工業化”&#xff1a;僵尸網絡商品化&#xff1a;黑市上&…

如何用 Rust 重寫 SQLite 數據庫(二):是否有市場空間?

用 Rust 實現一個類似 SQLite 的嵌入式數據庫非常有意義&#xff0c;但需要結合具體目標和場景來評估其價值。以下從技術、生態、市場需求和個人成長等多個維度展開分析&#xff0c;并給出結論。一、技術價值&#xff1a;Rust 與數據庫的天然契合 SQLite 作為全球裝機量最大的數…

【Web】ImaginaryCTF 2025 wp

目錄 imaginary-notes certificate codenames-1 passwordless pearl imaginary-notes I made a new note taking app using Supabase! Its so secure, I put my flag as the password to the "admin" account. I even put my anonymous key somewhere in the si…