C++之旅-string

2021-03-02 編程珠璣
前言

標準庫類型string表示可變長字符序列,使用之前需要包含string頭文件,它定義在命名空間std中。

string初始化

string s1   
string s2(s1)    
string s2 = s1    
string s3 = ("hello") 
string s3("hello")   
string s4(n,'c')    

其中string s4的初始化等價於下面的語句:

string temp(8,'a');
string s5 = temp;

如果使用=初始化一個變量,執行的是拷貝初始化,編譯器把等號右邊的初始值拷貝到新創建的對象中,否則為直接初始化

string操作讀寫string

可以使用標準庫中的iostream來讀寫string對象。
例如:

#include<iostream>
using namespace std;
int main()
{
    string s;
    cin >> s;   
    cout<< s << endl; 
    return 0;
}

運行程序,在控制臺輸入: Hello world。
輸入和輸出結果如下:

 Hello world
Hello

可以看到,string對象會自動忽略開頭的空白(空格符,換行符,制表符等)並從第一個真正的字符開始讀起,直到遇到下一處空白。
另外,string對象的輸入輸出操作會返回運算符左側運算對象,並將其作為結果:

cin >> s1 >> s2;

也就是說,對於上面的表達式,在運算cin >> s1之後,返回cin,繼續運算cin >> s2。最終會將第一個輸入讀到s1,第二個輸入讀到s2中。

讀取整行

整行讀取可以使用getline函數。getline的讀取會保留輸入時的空白,遇到換行符才結束(換行符也被讀取進來了)。遇到空行時,讀取到的是空串。

#include<iostream>
using namespace std;
int main()
{
    string line;
    if(getline(cin,line))
    {
        cout<< line;
        cout<< line;
    }
    return 0;
}

輸入輸出結果:

    HELLO                                                                              
    HELLO    HELLO   

可以看到:

字符串比較

比較s1和s2所含的字符是否完全一樣,可以使用下面的方式:

s1 == s2

string的大小比較是利用字符在字典序比較:

s1 > s2
s1 <= s2

判斷string對象是否為空串

例如:

s.empty()  

獲取string對象長度

例如:

s.size()

注意:這個表達式的返回值類型為string::size_type,它是一個無符號類型,因此避免用有符號類型,例如int來存儲或者比較其長度。一個無符號數和一個負的有符號數比較大小時,有符號數會被轉換為很大的無符號數,因此常常得到的結果就是這個無符號數小於這個負的有符號數。(可參考C語言入坑指南-整型的隱式轉換與溢出)

字符串相加

有以下幾種方式:

s1 + s2  
s1 + 「world」  

注意:字符字面值和string對象使用+運算符時,兩側運算對象至少一個是string。
下面的操作是非法的:

strings s = "hello" + "world"; 

字符串訪問

要訪問字符串中的字符,可直接使用下表運算符[],例如:

s[0]   
s[s.size()-1] 

遍歷字符串,可使用for each:

for(auto c : s)     
    cout << c << endl;  

同樣也可以使用常規方式:

unsignen int loop ;
for(loop = 0; loop < s.size();loop++)
    cout << s[loop] << endl;

總結

關注公眾號【編程珠璣】,第一時間獲取更多原創技術文章

堅持原創

相關焦點

  • c++ fstream + string 處理大數據
    之前處理文本數據時,各種清洗數據用的都是java的File,FileReader/FileWriter,BufferedReader/BufferedWriter等類,詳見java讀寫文件(2)應用java的原因是java裡面的map非常靈活,eclipse編譯器更是給力,而且ctrl可以追蹤函數等,詳見java map的排序(3)應用java的另一個原因是java裡面的string
  • c++ fstream + string處理大數據
    (2)應用java的原因是java裡面的map非常靈活,eclipse編譯器更是給力,而且ctrl可以追蹤函數等,詳見java map的排序(3)應用java的另一個原因是java裡面的string類的字符串處理非常靈活,各種函數是應用盡有。
  • 在C++中將string轉換為char數組
    來自:https://www.linuxmi.com/c-string-char.html相信很多人都遇到過這樣一個錯誤:『cannot
  • C++之字符串類學習總結
    一、回顧c語言對字符串的實現:一般我們在c語言要實現對字符串操作的話,一般是採用字符數組或者一組函數來實現的,為啥這樣做呢,那是因為c語言裡面根本就沒有字符串類型的關鍵字;而且c語言也支持自定義類型,所以更加無法獲得字符串類型為了解決這個問題,在c++
  • 自己實現 to_string 性能提升415%
    是不是還在使用 to_string,很影響性能的好不。零、背景之前在《你知道嗎?
  • C++ string 類詳解
    string 類定義隱藏了字符串的數組性質,讓我們可以像處理普通變量那樣處理字符串。string 對象和字符數組之間的主要區別是:可以將 string 對象聲明為簡單變量,而不是數組。1.1 string 類幾種常見的構造函數:1)string(const char *s) :將 string 對象初始化為 s 指向的字符串2)string(size_type n,char c) :創建一個包含 n 個元素的 string 對象,其中每個元素都被初始化為字符 c3)string(const
  • c++中的string常用函數用法總結
    標準c++中string類函數介紹注意不是CString之所以拋棄char*的字符串而選用
  • C++之旅-vector
    初始化與string類型一樣,vector也有很多種方式進行初始化:vector<int> v1;    vector<int> v2(v1);  vector<int> v2 = v1; vector<string> v3(3,"hello"); vector<string>
  • 跟我學C++中級篇——STL中的字符串
    +》和網上c++大牛陳碩的相關資料完善的。三、字符串的操作1、插入和連接void TestString(){    std::string s1 = "abcd";    std::string s2 = "efghi";    std::string s_add = s1 + s2;    std::cout << "string content:" <
  • json for modern c++的使用
    json for modern c++是一款非常好用的json庫,具有語法直觀和使用簡單的特點,並且是用C++11標準編寫的,此外還支持STL和json容器之間的轉換,可謂集方便又強大。本文推薦給廣大C++程式設計師,相信學習完本文之後,在處理json時一定會得心應手。
  • C++ 的幾個for 循環,範圍for語句
    例子:#include <iostream>using namespace std;int main(){ string str("this is a c++"); //每行輸出str中的一個字符 for(
  • C++隨機排序容器中的元素
    作者:apocelipes連結:https://www.cnblogs.com/apocelipes/p/10351335.html在各種程序語言中都提供了將容器元素隨機排序的shuffle方法,c++
  • c++之重載函數學習總結
    代碼示例演示:#include <stdio.h>#include <string.h>int func(int x){    return x;}int func(int a, int b){
  • Java之String重點解析
    前言很高興遇見你~Java中的String對象特性,與c/c++語言是很不同的,重點在於其不可變性。那麼為了服務字符串不可變性的設計,則衍生出非常多的相關問題:為什麼要保持其不可變?底層如何存儲字符串?
  • 標準 C++ 中的 string 類的用法總結
    要想使用標準C++中string類,必須要包含#include <string>// 注意是<string>,不是<string.h>,帶.h的是C語言中的頭文件using std::string;using std::wstring;或using namespace std;
  • C/C++中字符串與數字轉換
    作者:wxquare連結:https://www.cnblogs.com/wxquare/p/6529027.html本文總結了四種字符串和數字相互轉換的方法,方法一和方法二是c++方法一:c++11中string中添加了下面這些方法幫助完成字符串和數字的相互轉換stod stof stoi stol stold stoll stoul stoull函數原型:float stof (const string& str, size_t* idx = 0);to_string to_wstring
  • 學習c++筆記——標準輸出流cout
    前和往常一樣,一邊喝早茶,一邊上網和女粉絲侃大山,在手機和平板電腦上整理修改《html5》、《javascript》、《css3》、《c語言》等多年前寫的教程(c++
  • c++11新特性,所有知識點都在這了!
    的模板改進並發c++11關於並發引入了好多好東西,有:詳細介紹請看:c++11新特性之線程相關所有知識點這裡也使用c++11來實現的線程池和定時器,可以看:C++線程池的實現之格式修訂版C++定時器的實現之格式修訂版智能指針很多人談到c++,說它特別難,可能有一部分就是因為c++的內存管理吧,不像java那樣有虛擬機動態的管理內存,在程序運行過程中可能就會出現內存洩漏
  • 使用 C++ 的 StringBuilder 提升 4350% 的性能
    chr>class StringBuilder { typedef std::basic_string<chr> string_t; typedef std::list<string_t> container_t; // Reasons not to use vector below.
  • 新手入門:關於C++中的內聯函數(inline)
    >   在c++中,為了解決一些頻繁調用的小函數大量消耗棧空間或者是叫棧內存的問題,特別的引入了inline修飾符,表示為內聯函數。  下面我們來看一個例子:#include <iostream>  #include <string>  using namespace std;    inline string