C++ String知識點

當然可以!下面我將以系統全面、通俗易懂、深入淺出的方式,為你講解 C++ 中非常核心但也容易被低估的內容 —— std::string


🌟 C++ std::string 全面詳解

📌 一、string 是什么?

C++ 的 std::string 是 C++ 標準庫中封裝好的字符串類,本質是一個用于處理文本數據的容器。它定義在頭文件:

#include <string>

? 與 C 語言字符串的區別

特點C 字符串 (char[])C++ 字符串 (std::string)
存儲方式字符數組 + 結束符 \0類對象,有長度信息
可否動態擴展? 不能自動擴展? 自動擴展,支持追加
操作接口函數庫函數(如 strcpy成員函數(如 .append()
安全性易越界、不安全較安全,支持邊界檢查

📌 二、string 的常見構造方式

std::string s1;                   // 空字符串
std::string s2 = "hello";         // 從字符串字面值構造
std::string s3("world");          // 同上,直接構造
std::string s4(5, 'a');           // "aaaaa"
std::string s5 = s2 + s3;         // 拼接字符串 "helloworld"

📌 三、常用操作方法與功能詳解

🧩 1. 訪問字符串內容

std::string str = "hello";
char c1 = str[1];        // 'e'
char c2 = str.at(1);     // 更安全,帶邊界檢查

🧩 2. 修改字符串內容

str[0] = 'H';           // "Hello"
str.push_back('!');     // "Hello!"
str.pop_back();         // "Hello"

🧩 3. 添加和連接字符串

std::string s = "Hi";
s += " there";          // "Hi there"
s.append("!!!");        // "Hi there!!!"

🧩 4. 字符串長度

s.size();    // 字符個數(等同于 s.length())
s.empty();   // 是否為空

🧩 5. 查找與替換

std::string s = "I love C++";
size_t pos = s.find("love");   // 2
s.replace(pos, 4, "like");     // "I like C++"
  • find(str):返回首次出現位置
  • rfind(str):返回最后一次出現的位置
  • find_first_of(characters):任意字符第一次出現
  • replace(pos, len, new_str):替換一部分內容

🧩 6. 子串操作

std::string s = "abcdef";
std::string sub = s.substr(2, 3);  // "cde"

🧩 7. 清空和比較

s.clear();         // 清空字符串
s1 == s2           // 比較內容是否相等(重載了 ==)
s1.compare(s2);    // 返回負數/0/正數

📌 四、string 的迭代器支持(像容器一樣)

for (char c : s) {std::cout << c;
}

也支持:

std::string::iterator it = s.begin();
while (it != s.end()) {std::cout << *it;++it;
}

📌 五、與 C 風格字符串互轉

🔁 string → C 字符串

const char* cstr = s.c_str();   // 返回 const char*

🔁 C 字符串 → string

char buf[] = "abc";
std::string s(buf);

📌 六、常見陷阱??

  1. 別忘記包含頭文件

    #include <string>
    
  2. c_str() 返回的是 const char*,不能修改!

  3. at() 有越界檢查,[] 沒有。

  4. substr(pos, len) 若超出范圍不會拋異常,而是只截取可用部分。


📌 七、小案例:單詞統計器

#include <iostream>
#include <string>int main() {std::string input;std::cout << "請輸入一句話:";std::getline(std::cin, input);int word_count = 0;bool in_word = false;for (char c : input) {if (!isspace(c)) {if (!in_word) {word_count++;in_word = true;}} else {in_word = false;}}std::cout << "單詞數:" << word_count << std::endl;return 0;
}

📌 八、string 底層原理簡述(進階)

  • 實際上 std::string 是一個類,內部有一個動態分配的字符數組。
  • C++11 起,大多數實現采用 Small String Optimization(SSO) —— 小字符串會直接存在對象內部,不會動態分配。
  • 動態增長時,std::string 會申請更大的內存空間并拷貝內容,策略類似于 vector

? 九、string 相關常用函數速查表

操作函數名示例
長度.size()s.size()
添加字符.push_back(c)s.push_back('!')
添加字符串.append(str)s.append("abc")
查找子串.find(str)s.find("abc")
替換子串.replace(p, l, r)s.replace(2, 3, "hi")
截取子串.substr(p, l)s.substr(0, 3)
清空.clear()s.clear()
比較字符串.compare(str)s.compare("abc")
轉C字符串.c_str()printf("%s", s.c_str())
插入子串.insert(pos, s)s.insert(2, "xx")
刪除部分.erase(pos, len)s.erase(0, 2)

📚 十、推薦用法技巧

  • 使用 std::getline() 獲取帶空格的整行輸入。
  • 使用 + 運算符快速拼接多個字符串。
  • 當性能關鍵時,盡量避免頻繁拼接小字符串(會頻繁分配內存)。

如果你感興趣,我還可以講:

  • std::string_view 的輕量引用方式
  • 多語言支持(Unicode處理)
  • ostringstream 結合 string 輸出字符串
  • std::format(C++20)處理格式化字符串

需要我繼續擴展哪一部分嗎?比如底層實現、性能優化、string_view、高級技巧、源碼分析等,我都可以展開講。

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

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

相關文章

全新NVIDIA Llama Nemotron Nano視覺語言模型在OCR基準測試中準確率奪冠

全新NVIDIA Llama Nemotron Nano視覺語言模型在OCR基準測試中準確率奪冠 PDF、圖表、圖形和儀表板等文檔是豐富的數據源&#xff0c;當這些數據被提取和整理后&#xff0c;能夠為決策制定提供有價值的洞察。從自動化財務報表處理到改進商業智能工作流程&#xff0c;智能文檔處…

gradle的 build時kaptDebugKotlin 處理數據庫模塊

gradle的 build時輸出&#xff1a; Task :app:kaptDebugKotlin 注: Processing class HDCoinBean 注: Processing class HDCurrencyBean 注: Processing class HDSelfAddCoin 注: Processing class MN 注: Creating DefaultRealmModule <—> 80% EXECUTING [7m 56s] IDLE…

二叉樹的節點操作算法

235. 二叉搜索樹的最近公共祖先 力扣題目鏈接(opens new window) 給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大…

【ubuntu驅動安裝】安裝nvidia驅動和cuda環境

1、安裝驅動 首先查看環境和顯卡&#xff1a; 更新apt 查看nouveau是否禁用 如果有返回值禁用nouveau(nouveau是通用的驅動程序)&#xff08;必須&#xff09;&#xff0c;兩種文件&#xff0c;22.04是下面那個 添加如下&#xff1a; 終端輸入后更新 重啟電腦sudo reboo…

力扣HOT100之終章:一些隨筆

今天終于把力扣HOT100系列給刷完了&#xff0c;每一道題都記錄了自己的思考過程和解題過程中參考的一些題解和視頻&#xff0c;方便自己以后再刷的時候快速復習&#xff0c;從2025年3月4日寫下第一篇博客&#xff0c;到2025年6月12日完成最后一題并寫下最后一篇博客&#xff0c…

榕壹云家政系統:基于Spring Boot與UniApp的智能家政服務解決方案

在數字化浪潮下&#xff0c;傳統家政行業正面臨效率與服務質量的升級挑戰。榕壹云公司依托前沿技術&#xff0c;推出了一款用戶端與師傅端二合一的家政服務小程序&#xff0c;通過整合預約上門、分銷、儲值、優惠券等功能&#xff0c;為家政服務行業提供了一套高效、靈活的數字…

CSRF擴展 JSONP劫持

介紹&#xff1a;JOSNP&#xff08;JSONP with Override Security Negotiation Protocol&#xff09;劫持是一種利用JSONP &#xff08;JSON with Padding&#xff09;跨域數據獲取機制的安全漏洞&#xff0c;攻擊者通過篡改或偽造JSONP回調函數竊 取用戶敏感數據。由于JSONP…

HTTP/HTTPS 協議解析

前言 在當今互聯網時代&#xff0c;HTTP/HTTPS 協議作為 Web 通信的基石&#xff0c;承載著幾乎所有的網絡內容傳輸。對于我們而言&#xff0c;深入理解這些協議不僅是技術素養的體現&#xff0c;更是構建高性能、安全、可靠 Web 應用的必要條件。 為什么我們需要深入了解 HT…

Flask-login 處理授權邏輯

認證 vs 授權&#xff1a; 在 Web 應用程序的安全機制中&#xff0c;認證&#xff08;Authentication&#xff09; 和 授權&#xff08;Authorization&#xff09; 是兩個核心概念&#xff0c;它們雖然緊密相關&#xff0c;但職責和作用不同。 認證&#xff08;Authenticatio…

xenomai3+linux構建linux實時操作系統-基于X86_64和arm

簡介&#xff1a; Xenomai是一個實時性解決方案&#xff0c;通過在Linux上添加實時內核Cobalt來增強實時性能。它有三個主要部分&#xff1a;libcobalt&#xff08;用戶空間實時庫&#xff09;、Cobalt&#xff08;內核空間實時內核&#xff09;和硬件架構特定層&#xff08;ip…

Linux核心文件(core file)詳解

一、核心文件&#xff08;core file&#xff09;概述 1.1 什么是核心文件 核心文件&#xff08;core file&#xff09;是Linux操作系統在程序崩潰時生成的一種轉儲文件。它包含了程序崩潰時的內存內容、寄存器狀態和執行狀態。通過分析核心文件&#xff0c;開發者可以找到程序…

java中跨域問題及解決方案

1. 什么是跨域 從不同的地址訪問另外一個地址就是跨域 2.跨域一定會有異常嗎 跨域異常只會在前端發生&#xff0c;后端跨域不會產生異常 因為瀏覽器有一個叫做同源策略的東西&#xff0c;它發現不同域之間的訪問是不安全的行為&#xff0c;會禁止&#xff0c;所以會拋出異常…

網絡層協議 IP 協議介紹 -- IP 協議,網段劃分,私有 IP 和 公網 IP,路由

目錄 1 IP 協議 1.1 IP 協議格式 2. 網段劃分 2.1 網絡號和主機號 2.2 傳統 IP 地址分類和 CIDR 技術 2.3 特殊的 IP 地址 2.4 IP 地址的數量限制 2.5 私有 IP 和公網 IP 3. 路由 網絡層主要作用是實現不同局域網之間的通信連接&#xff0c;并為數據在復雜網絡環境中的…

【案例分享】KMDA-7611-S001--高性能嵌入式電腦助力雙臂輪式人形機器人應用

智能制造時代&#xff0c;雙臂輪式機器人需求浮出水面 隨著制造業、物流業和電子商務的飛速發展&#xff0c;智能搬運機器人正成為行業降本增效的核心工具。它們不僅解決了傳統物流中效率低、成本高、安全性差等痛點&#xff0c;更通過智能化與可擴展性設計&#xff0c;通過自主…

iOS App上線前的安全防線:項目后期如何用Ipa Guard與其他工具完成高效混淆部署

對大多數iOS開發者來說&#xff0c;安全并不是開發早期就能解決的問題。尤其在項目逐步進入上線準備階段后&#xff0c;才開始集中考慮逆向破解、資源泄露等安全隱患的解決方案。這個階段往往時間緊張、結構復雜&#xff0c;再要重構源碼或引入大規模修改幾乎不現實。因此&…

技術佃農時代:當云計算成為新型地主經濟

技術佃農時代:當云計算成為新型地主經濟 導語:當算力成為生產資料,云賬單背后的「數字佃租」正悄然重塑IT生產關系——我們是否在用自己的代碼為云廠商開墾數字荒地? 一、揭開云計算的「佃租算法」面紗 // 云經濟體的核心收割邏輯 public class CloudLandlord {public sta…

23種設計模式圖解

《設計模式&#xff1a;可復用面向對象軟件的基礎》是軟件工程領域的經典著作&#xff0c;由四位頂尖專家&#xff08;Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides&#xff0c;合稱GoF&#xff09;編寫&#xff0c;首次系統化提出了23種設計模式&#xff0c;分為…

git新建一個分支到gitlab項目目錄中

先向git確認身份 git config --global user.email "youexample.com"看一下當前在哪個分支上&#xff08;沒啥影響&#xff09; git status lculation$ git status 位于分支 my_new_branch 您的分支與上游分支 origin/main 一致。 用origin/main分支來新建一個分支 …

云原生時代配置中心全景解讀:從Spring Cloud Config到Nacos深度實踐

摘要&#xff1a;在分布式系統和云原生架構中&#xff0c;配置管理已從簡單的鍵值存儲演進為核心基礎設施組件。本文深入解析四大主流配置中心&#xff08;Spring Cloud Config、Apollo、Nacos、Consul&#xff09;的架構設計與實戰應用&#xff0c;并分享生產環境下的最佳實踐…

Vue3 defineModel 原理解析

1. 引言 在上一篇文章中探討了v-model的實現原理&#x1f517;。本文將聚焦于Vue3.4版本新增的defineModel語法糖&#xff0c;它顯著簡化了組件中v-model的實現方式。我們將詳細解析defineModel的工作原理&#xff0c;并與3.4版本之前實現組件v-model的方法進行對比。 2. Vue…