C++ string使用方法

来源:https://www.cnblogs.com/weijiong/archive/2022/05/03/16217265.html
-Advertisement-
Play Games

string是C標準模板庫中專門用於字元串處理的數據結構類型。它並不是 C的基本數據類型,它是 C++標準模板庫中的一個“類”。若要使用 string 對象,則必須包含頭文件#include <string>。 初始化 常用的初始化有以下幾種,帶等號的是拷貝初始化, string str1("hel ...


string是C++標準模板庫中專門用於字元串處理的數據結構類型。它並不是 C++的基本數據類型,它是 C++標準模板庫中的一個“類”。若要使用 string 對象,則必須包含頭文件#include <string>。

  1. 初始化
    常用的初始化有以下幾種,帶等號的是拷貝初始化,
string str1("hello world");    // hello world
string str2  = "hello world";  // hello world
string str3(str2);             // hello world
string str4 = str3;            // hello world
string str5(5,'d');            // ddddd
string str6(str2, 6);          // world,從str2的第6個字元開始到結束,拷貝到str6中
string str7(str2, 0, 5);       // hello, 從str2的第0個字元開始拷貝5個字元到str7中
char buff[] = "hello sorld";
string str8(buff, 5);          // hello, 拷貝buff的前5個字元到str8中

特殊數據結構成員
static const size_t npos = -1;

  1. string 的基本操作
  • 長度
size_t length() const noexcept;   // 得到字元串的長度
size_t size() const noexcept;     // 得到字元串的長度
size_t max_size() const noexcept; // 得到字元串可以達到的最大長度
  • 插入
    在指定的位置後面插入一個字元串
// 在pos後面插入字元串str
string& insert (size_t pos, const string& str);             
// 在pos後面插入str的subpos處往後的sublen長度的字元串
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen); 
// 在pos後面插入字元數組s
string& insert (size_t pos, const char* s);                           
// 在pos後面插入字元數組s的前n個字元
string& insert (size_t pos, const char* s, size_t n);                       
// 在pos後面插入n個字元c
string& insert (size_t pos, size_t n, char c);                            
// 在p後面插入n個字元c  
iterator insert (const_iterator p, size_t n, char c);                       
// 在p後面插入一個字元c
iterator insert (const_iterator p, char c);  
// 在p後面插入迭代器first到last之間的字元串                                
template <class InputIterator>
iterator insert (iterator p, InputIterator first, InputIterator last);    
// 在p後面插入il內的所有字元
string& insert (const_iterator p, initializer_list<char> il);                 
  • 替換
    把指定的位置後指定長度的字元串替換成另一個字元串
// 把pos後面len長度的字元串替換成str
string& replace (size_t pos, size_t len, const string& str);
// 把i1和i2之間的內容替換成str
string& replace (const_iterator i1, const_iterator i2, const string& str);

// 把pos後面len長度的字元串替換成字元串str的subpos後面的sublen個長度的字元串
string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);

// 把pos後面len長度的字元串替換成字元數組s里的所有內容
string& replace (size_t pos, size_t len, const char* s);
// 把i1和i2之間的字元串替換成數組s里的所有內容
string& replace (const_iterator i1, const_iterator i2, const char* s);

// 把pos後面len長度的字元串替換成字元數組s裡面前n個字元
string& replace (size_t pos, size_t len, const char* s, size_t n);
// 把i1和i2之間的字元串替換成字元數組s裡面的前n個字元
string& replace (const_iterator i1, const_iterator i2, const char* s, size_t n);

// 把pos後面len長度的字元串替換成n個字元c
string& replace (size_t pos, size_t len, size_t n, char c);
// 把i1和i2之間的字元串替換成n個字元c
string& replace (const_iterator i1, const_iterator i2, size_t n, char c);

// 把i1和i2之間的字元串替換成迭代器first與last之間的內容
template <class InputIterator>
string& replace (const_iterator i1, const_iterator i2, InputIterator first, InputIterator last);

// 把字元串i1和i2之間的內容替換成il里的所有字元
string& replace (const_iterator i1, const_iterator i2, initializer_list<char> il);
  • 添加
    在字元串的末尾添加另一個字元串的內容
// 在字元串的末尾添加另一個字元串str
string& append (const string& str);
string& operator+= (const string& str);
// 在字元串的末尾添加兩一個字元串str的subpos後面sublen長度的字元串
string& append (const string& str, size_t subpos, size_t sublen);
// 在字元串的末尾添加字元數組s里的所有內容
string& append (const char* s);
string& operator+= (const char* s);
// 在字元串的末尾添加字元數組s的前n個字元
string& append (const char* s, size_t n);
// 在字元串的末尾添加n個字元c
string& append (size_t n, char c);
// 在字元串的末尾添加一個字元c
string& operator+= (char c);
// 在字元串的末尾添加迭代器first與last之間的字元
template <class InputIterator>
string& append (InputIterator first, InputIterator last);
// 在字元串的末尾添加il里的所有內容
string& append (initializer_list<char> il);
string& operator+= (initializer_list<char> il);
  • 賦值
    用新的字元串替換掉本字元串的內容
// 用str替換掉本字元串的內容
string& assign (const string& str);
string& operator= (const string& str);
// 用str里的subpos後面sublen個長度的字元串替換掉本字元串的內容
string& assign (const string& str, size_t subpos, size_t sublen);
// 用字元數組s里的的所有字元替換掉本字元串的內容
string& assign (const char* s);
string& operator= (const char* s);
// 用字元數組s的前n個字元替換掉本字元串里的內容
string& assign (const char* s, size_t n);
// 把本字元串替換成n個字元c
string& assign (size_t n, char c);
// 用迭代器first和last之間的字元替換掉本字元串的內容
template <class InputIterator>
string& assign (InputIterator first, InputIterator last);
// 用il里的所有字元串替換掉本字元串的內容
string& assign (initializer_list<char> il);
string& operator= (initializer_list<char> il);
// 用str替換掉本字元串的內容
string& assign (string&& str) noexcept;
string& operator= (string&& str) noexcept;
// 將字元串的長度置為1,並把字元C填充到字元串里
string& operator= (char c);
  • 刪除
    刪除指定位置後面指定長度的字元
// 刪除pos後面len個長度的字元
string& erase (size_t pos = 0, size_t len = npos);
// 刪除迭代器p到末尾的所有字元
iterator erase (iterator p);
// 刪除迭代器first與last之間的字元
iterator erase (iterator first, iterator last);
  • 清空
    清空字元串,得到一個空的字元串
// 清空字元串
void clear() noexcept;
  • 為空
    判斷字元串的內容是否為空
// 判斷字元串是否為空
bool empty() const noexcept;
  • 剪切
    得到指定位置後面指定長度的字元串
// 返回pos後面len個長度的字元串
string substr (size_t pos = 0, size_t len = npos) const;
  • 比較
    指定位置後面指定長度的字元串與另一個字元串進行比較
    返回值:0,兩個字元串相等;
    <0,參與比較的字元串不匹配的第一個字元的值較低,或者所有比較的字元都匹配但參與比較的字元串較短;
    >0,參與比較的字元串不匹配的第一個字元的值更大,或者所有比較的字元都匹配但參與比較的字元串更長。
// 本字元串與str進行比較
int compare (const string& str) const noexcept;
// 本字元串pos後面len長度的字元串與str進行比較
int compare (size_t pos, size_t len, const string& str) const;
// 本字元串pos後面len長度的字元串與str的subpos位置後面sublen長度的字元串進行比較
int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen) const;
// 本字元串與字元數組的所有字元進行比較
int compare (const char* s) const;
// 本字元串pos後面len長度的字元串與字元數組s里的所有字元進行比較
int compare (size_t pos, size_t len, const char* s) const;
// 本字元串pos後面len長度的字元串與字元數組s里前n個字元進行比較
int compare (size_t pos, size_t len, const char* s, size_t n) const;
  • 交換
    與另一個字元串交換它們的內容
// 與str交換內容
void swap (string& str);
  • 修改長度
    請求修改字元串容量的大小,長度最多為n個字元。
    如果n大於當前的字元串容量,則該函數會使容器將其容量增加到n個字元(或更大)。
    在所有其他情況下,它都被視為縮小字元串容量的非綁定請求:容器實現可以自由地進行優化,並使字元串的容量大於n。
    此函數對字元串長度沒有影響,也不能改變其內容。
// 將字元串的長度重置為n
void reserve (size_t n = 0);
  • 重設
    把字元串重新設置成指定的長度的字元
    如果重設後的長度小於原長度,刪除多餘的字元
    如果重設後的長度大於原長度,則在結尾處插入空字元或指定的字元到達指定的長度
// 將字元串重設成n個長度的空字元串
void resize (size_t n);
// 將字元串重設成n個長度的c字元
void resize (size_t n, char c);
  • 刪除末尾字元
    刪除字元串末尾的一個字元
// 彈出字元串末尾的一個字元
void pop_back();
  • 在末尾添加字元
    在字元串的末尾添加一個字元
// 在字元串的末尾添加一個字元c
void push_back (char c);
  • 得到C類型的字元串
    轉換成等價的C字元串
// 轉換成等價的C字元串
const char* c_str() const noexcept;
// 得到該字元串的數組指針
const char* data() const noexcept;
  • 取字元
    得到指定位置處的字元
// 得到指定位置處的字元
char& at (size_t pos);
const char& at (size_t pos) const;
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
// 得到字元串的第一個字元
char& front();
const char& front() const;
// 得到字元串的最後一個字元
char& back();
const char& back() const;
  • 拷貝
    將字元串的指定內容拷貝到字元數組裡
// 將字元串pos處開始的len長度的字元串拷貝到字元數組s裡面
size_t copy (char* s, size_t len, size_t pos = 0) const;
  • 交換
    交換兩個字元串里的內容
// 交換x換y的值
void swap (string& x, string& y);
  • 查找
    查找字元串中指定字元或字元串出現的第一處位置
    如果沒有匹配的,返回string::npos
// 從字元串的pos處開始查找與字元串str相同的字元串
size_t find (const string& str, size_t pos = 0) const;
// 從字元串的pos處開始查找與字元數組s相同的字元串
size_t find (const char* s, size_t pos = 0) const;
// 從字元串的pos處開始長度為n的範圍內查找與字元數組s相同的字元串
size_t find (const char* s, size_t pos, size_t n) const;
// 從字元串串的pos處開始查找與字元c相同的字元
size_t find (char c, size_t pos = 0) const;

查找字元串中指定字元或字元串出現的最後一處位置
如果沒有匹配的,返回string::npos

// 查找在字元串pos之前的最後一個與字元串str相匹配的字元串的位置
size_t rfind (const string& str, size_t pos = npos) const noexcept;
// 查找在字元串pos之前的最後一個與字元數組s相匹配的字元串的位置
size_t rfind (const char* s, size_t pos = npos) const;
// 查找在字元串pos之前的n個字元內最後一個與字元數組s相匹配的字元串的位置
size_t rfind (const char* s, size_t pos, size_t n) const;
// 查找在字元串pos之前的最後一個與字元c匹配的字元的位置
size_t rfind (char c, size_t pos = npos) const noexcept;

查找字元串中與其參數中指定的任何字元匹配的第一個字元
如果沒有匹配的,返回string::npos

// 查找字元串中的pos處開始與字元串str里的任一字元相同的第一個位置
size_t find_first_of (const string& str, size_t pos = 0) const noexcept;
// 查找字元串中的pos處開始與字元數組s里的任一字元相同的第一個位置
size_t find_first_of (const char* s, size_t pos = 0) const;
// 查找字元串中的pos處開始長度為n的字元串內與字元數組s里的任一字元相同的第一個位置
size_t find_first_of (const char* s, size_t pos, size_t n) const;
// 查找字元串中的pos處開始第一個與字元c相同的位置
size_t find_first_of (char c, size_t pos = 0) const noexcept;

查找字元串中與其參數中指定的任何字元匹配的最後一個字元
如果沒有匹配的,返回string::npos

// 查找字元串中的pos之前的所有字元與字元串str里的任一字元相同的最後一個位置
size_t find_last_of (const string& str, size_t pos = npos) const noexcept;
// 查找字元串中的pos之前的所有字元與字元數組s里的任一字元相同的最後一個位置
size_t find_last_of (const char* s, size_t pos = npos) const;
// 查找字元串中的pos之前長度為n的字元串內與字元數組s里的任一字元相同的最後一個位置
size_t find_last_of (const char* s, size_t pos, size_t n) const;
// 查找字元串中的pos之前的所有字元里最後一個與字元c相同的位置
size_t find_last_of (char c, size_t pos = npos) const noexcept;

查找字元串中與指定的字元數組或字元串里的任一字元都不匹配的第一個位置
如果沒有找到(即參與比較的部分完全相同),返回string::npos

// 比較字元串pos後面的全部字元與字元串str里的任一字元都不同的第一個字元所在的位置
size_t find_first_not_of (const string& str, size_t pos = 0) const noexcept;
// 比較字元串pos後面的全部字元與字元數組s里的任一字元都不同的第一個字元所在的位置
size_t find_first_not_of (const char* s, size_t pos = 0) const;
// 比較字元串pos後面的n個字元與字元數組s里的任一字元都不同的第一個字元所在的位置
size_t find_first_not_of (const char* s, size_t pos, size_t n) const;
// 比較字元串pos後面的全部字元與字元c不同的第一個字元所在的位置
size_t find_first_not_of (char c, size_t pos = 0) const noexcept;

查找字元串中與指定的字元數組或字元串里的任一字元都不匹配的最後一個位置
如果沒有找到(即參與比較的部分完全相同),返回string::npos

// 比較字元串pos前面的全部字元與字元串str里的任一字元都不同的最後一個字元所在的位置
size_t find_last_not_of (const string& str, size_t pos = npos) const noexcept;
// 比較字元串pos前面的全部字元與字元數組s里的任一字元都不同的最後一個字元所在的位置
size_t find_last_not_of (const char* s, size_t pos = npos) const;
// 比較字元串pos前面的n個字元與字元數組s里的任一字元都不同的最後一個字元所在的位置
size_t find_last_not_of (const char* s, size_t pos, size_t n) const;
// 比較字元串pos前面的全部字元與字元c不同的最後一個字元所在的位置
size_t find_last_not_of (char c, size_t pos = npos) const noexcept;
  • operator
    重載+運算符
    返回一個新構造的字元串對象,其值為lhs中的字元和rhs中的字元的連接
string operator+ (const string& lhs, const string& rhs);
string operator+ (string&&      lhs, string&&      rhs);
string operator+ (string&&      lhs, const string& rhs);
string operator+ (const string& lhs, string&&      rhs);

string operator+ (const string& lhs, const char*   rhs);
string operator+ (string&&      lhs, const char*   rhs);
string operator+ (const char*   lhs, const string& rhs);
string operator+ (const char*   lhs, string&&      rhs);

string operator+ (const string& lhs, char          rhs);
string operator+ (string&&      lhs, char          rhs);
string operator+ (char          lhs, const string& rhs);
string operator+ (char          lhs, string&&      rhs);

重載==運算符
比較lhs與rhs是否相等

bool operator== (const string& lhs, const string& rhs) noexcept;
bool operator== (const char*   lhs, const string& rhs);
bool operator== (const string& lhs, const char*   rhs);

重載!=運算符
比較lhs與rhs是否不等

bool operator!= (const string& lhs, const string& rhs) noexcept;
bool operator!= (const char*   lhs, const string& rhs);
bool operator!= (const string& lhs, const char*   rhs);

重載<運算符
比較lhs是否小於rhs

bool operator<  (const string& lhs, const string& rhs) noexcept;
bool operator<  (const char*   lhs, const string& rhs);
bool operator<  (const string& lhs, const char*   rhs);

重載<=運算符
比較lhs是否小於等於rhs

bool operator<= (const string& lhs, const string& rhs) noexcept;
bool operator<= (const char*   lhs, const string& rhs);
bool operator<= (const string& lhs, const char*   rhs);

重載>運算符
比較lhs是否大於rhs

bool operator>  (const string& lhs, const string& rhs) noexcept;
bool operator>  (const char*   lhs, const string& rhs);
bool operator>  (const string& lhs, const char*   rhs);

重載>=運算符
比較lhs是否大於等於rhs

bool operator>= (const string& lhs, const string& rhs) noexcept;
bool operator>= (const char*   lhs, const string& rhs);
bool operator>= (const string& lhs, const char*   rhs);
  • 輸入輸出流
    從流中插入/獲取字元串
// 從流中提取字元串
istream& operator>> (istream& is, string& str);
// 將字元串插入流
ostream& operator<< (ostream& os, const string& str);

// 從流is中提取一行字元串到str中,直到劃分字元delim為止
istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
// 從流is中提取一行字元串到str中,直到換行為止
istream& getline (istream&  is, string& str);
istream& getline (istream&& is, string& str);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 輸入系統,輸入某個鍵,響應到GamePlay層做對應的事。例如 點擊滑鼠,前進還是開槍之類,是如何響應的。這裡只說應用層邏輯,硬體層邏輯不講述。 詳解 1.問題來源 先看下麵一個例子:跳躍的事件響應堆棧 從上述堆棧我們不難發現,疑惑點主要集中於 APlayerControllerProcess ...
  • 本文參考社長的 TinyWebServer 庖丁解牛 epoll 常用API epoll_create 函數 #include <sys/epoll.h> int epoll_create(int size); 創建一個指示 epoll 內核事件表的文件描述符,該描述符將用作其他 epoll 系統調 ...
  • 多線程筆記(一) 1. sleep()方法和yield()方法 共同點:讓當前線程釋放cpu資源,讓其他線程來運行 不同點:調用sleep()方法後,線程進入到TIMED_WAITING狀態,等待超時後進入RUNNABLE狀態,開始搶占CPU資源。調用yield()方法後,線程進入RUNNABLE狀 ...
  • pandas讀取Excel、csv文件中的數據時,得到的大多是表格型的二維數據,在pandas中對應的即為DataFrame數據結構。在處理這類數據時,往往要根據據需求先獲取數據中的子集,如某些列、某些行、行列交叉的部分等。可以說子集選取是一個非常基礎、頻繁使用的操作,而DataFrame的子集選取 ...
  • 8. 文件讀寫操作 1 #include<iostream> 2 #include<string> 3 #include<fstream> // 讀寫文件 頭文件 4 using namespace std; 5 6 // 文件操作 7 8 // 寫文件 9 void writefile() { 1 ...
  • 以下是我收集的一些問題,有的是網上摘錄的,有的是自己參加面試被問到的,有的是工作或學習時遇到的,等等。 為什麼要記錄這些呢? 一方面,我相信,這樣做對我自己的技術提升是有幫助的。在全文結構上我儘量**使問題連貫地形成知識體系**,而不是堆積的碎片,而且,每個問題我會儘量地給出答案。 另一方面,我希望... ...
  • VSCode開發環境配置 先到VSCode官網去下載適合自己系統的VSCode安裝軟體 VScode下載地址:https://code.visualstudio.com/Download ### 演示在WIndows下 安裝使用 (1)把vscode安裝軟體準備好 如果不清楚選64位還是32位可以在 ...
  • 文件操作(輸入輸出流) 文件操作的概述 程式運行時產生的數據都屬於零食數據,程式一旦運行結束,就會被釋放 通過文件可以將數據持久化 C++中對文件的操作包含頭文件(文件流) 文件類型分為兩種 文本文件:文件以文本的ASCII碼的形式存儲在電腦中 二進位文件:文件以文本的二進位形式存儲在電腦中,用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...