C++ 標準庫-字串 string 類

發表於2016-09-29

針對字串處理,C++中並沒有專門的內建型別。C語言是使用字元陣列以及相應的指標來表示字串。前面章節已經介紹了C++包容的C語言字串處理方式。下面將講解C++標準庫封裝字串處理的字串類型別。通過庫提供的字串型別公開方法介面,開發者可以很方便地定義操作字串,使得操作字串變得方便簡易。

1.1  string 字串物件構造

C++庫中提供的字串標準類是通過模板定義來實現的。其中,模板類basic_string主要用於表示兩類字串操作:一種是目前應用程式中常用的string型別;另一種是支援寬型別的字元操作。目前本章所講述的是string型別。名稱空間std中string其實只是basic_string模板類的別名。如果採用typedef定義string作為basic_string字元型別例項類的別名,其定義語句如下。

其中,模板類basic_string通過char字元型例項化其型別,即此時處理的字串為char型。然後通過typedef關鍵字定義string為該類型別別名。這樣,開發者就可以直接把string作為其類型別操作。下面所講述的庫提供的字串類就是直接採用string名稱來說明。

C++標準庫字串類的物件例項定義時會涉及該類建構函式來實現構造。對於標準的字串類,標準庫提供了多個建構函式。開發者需要根據定義物件例項的方式,來決定呼叫哪個建構函式來構造字串物件例項。下面講解定義實現幾種字串物件構造例項,幫助讀者瞭解標準庫字串類所提供的字串物件構造方式。

在定義中,字串類string提供了多種建構函式,實現了不同方式定義其物件例項並初始化。

q  第一種構造方式,通過傳入字串指標構造並初始化字串物件。

q  第二個則是通過傳入字元個數以及對應的字元來初始化既定個數字符的字串物件。

q  第三個則僅僅是通過建構函式來分配字串變數空間,暫時先不作任何初始化工作。

q  第四種方式是通過呼叫字串類建構函式隱式地去執行了轉換操作,給定義的字串物件賦值。

通常軟體開發中採用第三種構造方式。程式中僅僅先定義字串對應的物件,而賦值操作在實際應用中進行。字串類string使用時,要注意包含字串標準庫提供的標頭檔案#include。這樣可以在應用程式中具體的使用字串標準庫的介面。

1.2  string 字串賦值

C++標準庫字串類提供的字串賦值操作有多種操作介面可選擇。研究字串類標準定義可以看出,字串類賦值操作主要有兩種方式:一種利用賦值符號過載實現,即直接使用等於號的過載而實現。另一種是使用提供的assign()方法介面實現字串賦值操作。下面將會通過幾個賦值操作的例項,來講解標準字串類提供的賦值操作。

1.準備例項

開啟UE工具,建立新的空檔案並且另存為chapter1301.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。

本例項主要通過標準字串類演示字串物件相互賦值的操作情況。程式主要在主函式中演示字串賦值操作,程式具體詳解見程式註釋與後面講解。

2.編輯makefile

Linux平臺下需要編譯原始檔為chapter1301.cpp,相關makefile工程檔案編譯命令編輯如下所示。

上述makefile檔案套用前面的模板格式,主要替換了程式碼檔案、程式編譯中間檔案、可執行程式等。在編譯命令部分-g選項的加入,表明程式編譯同時加入了可調式資訊。

3. 編譯執行程式

當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。

本例項中主要使用標準字串類定義字串物件,演示了標準字串類提供的幾種賦值方式的操作。程式中使用到字串類時,需要include包含提供的標頭檔案。對於標準字串提供的等號賦值運算操作,初學者應該比較的熟悉。C++字串類提供的assign()方法的操作更加靈活的實現了字串賦值的種種可能出現的情況。該方法相對於等號賦值符的過載,並通過過載方法實現的賦值操作顯得更加靈活。

上述例項程式碼編寫非常的簡單,僅僅一個chapter1301.cpp程式碼原始檔。程式主流程處理在main函式中完成。下面依次講解五個字串的定義和初始化實現方式。

(1)首先定義string類的一個空字串物件mystring1,隨後的程式碼採用等號運算子為其賦值。此時mystring1字串中存放的即為字串“string”,下一行程式碼則列印輸出驗證mystring1中的值。

(2)定義字串物件mystring2時,採用另外一種構造並初始化的方式。將mystring1字串中的內容作為新定義字串mystring2的初始化值。此時mystring2字串物件中存放的即為mystring1的內容,為字串“string”。隨後,列印輸出並驗證。

(3)字串物件mystring3的定義同mystring1。通過定義構造一個空字串物件mystring3,隨後採用標準字串類提供的assign()方法為其賦值。此時呼叫的assign()方法,根據傳入實參mystring1為字串物件mystring3賦值。所以,mystring3中存放著字串mystring1的值,列印輸出驗證mystring3中存放著字串“string”。之後,mystring3又呼叫assign()方法。通過提供的過載assign()賦值方式,把mystring2字串第一個字元到第三個字元的字串賦給mystring3字串。此時mystring3中存放著字串“tri”。

注意:字串中字串位置從0開始計算。

(4)字串變數mystring4則通過呼叫assign()過載方法,將mystring1字串從位置1到字串結尾處賦值給字串mystring4,所以mystring4字串中存放的字串為“tring”。隨後,列印輸出驗證。

(5)字串mystring5則呼叫assign()方法,並採用指定字元方式來賦值。該方法根據傳入的實參使用4個’c’字元初始化該字串。最後,列印輸出mystring5中存放著字串“cccc”。

1.3  string字串連線

標準字串類提供了字串連線的操作介面。該類介面主要實現了運算子“+”、“+=”的過載。另外,使用者還可以使用成員函式append()提供的字串連線功能。標準字串類提供的連線操作介面原型如下。

根據標準字串類提供的連線介面,下面通過一個完整例項演示字串連線功能介面的應用情況。

1.準備例項

開啟UE工具,建立新的空檔案並且另存為chapter1302.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。

本例項程式主要通過標準字串類提供的字串連線介面,演示字串連線的基本操作。程式主要在主函式中實現,具體程式剖析見程式註釋與後面的講解。

2.編輯makefile

Linux平臺下需要編譯原始檔為chapter1302.cpp,相關makefile工程檔案編譯命令編輯如下所示。

上述makefile檔案套用前面的模板格式,主要替換了程式碼檔案、程式編譯中間檔案、可執行程式等。在編譯命令部分-g選項的加入,表明程式編譯同時加入了可調式資訊。

3.編譯執行程式

當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。

下面對程式碼依次進行介紹。

(1)首先定義字串物件mystring1,並通過等號賦值運算子為該字串賦值。此時列印輸出字串mystring1變數中的內容為“string”。

(2)定義空字串物件例項mystring2,並通過連線符號過載操作,將字串“123”連線到字串mystring1。同時,採用賦值運算子將連線結果存放於字串mystring2物件中,並列印mystring2字串。此時,字串物件mystring2中內容為“string123”。

(3)定義字串變數mystring3,並使用運算子“+=”過載實現的介面,將字串mystring2的內容連線至空字串mystring3,並存放到mystring3中。隨後,列印輸出mystring3的字串物件內容為“string123”。

(4)呼叫方法成員append(const char *str),將字串“456”追加到字串mystring3尾部,並列印其結果。此時mystring3字串中存放的字串內容為“string123456”。

(5)定義字串變數mystring4,並呼叫標準字串提供的連線方法成員方法append(),將字串“hello”中前4個字元連線到字串mystring4中。此時mystring4字串存放的結果為“hell”。字串物件mystring4再呼叫append(),將字串mystring1連線並存放至字串mystring4中。此時列印輸出mystring4字串內容為“hellstring”。

(5)定義字串物件mystring5,並呼叫append(),將字串mystring1中從位置2開始往後3個字元連線至字串mystring5中。列印輸出此時的mystring5,其內容為“rin”。隨後呼叫append()方法,將2個‘c’字元連線至mystring5字串尾部。此時,列印輸出字串mystring5內容為“rincc”。

1.4  string字串字元訪問

標準字串string類提供的下標主要用於字串中的字元訪問。標準string類中主要過載實現“[]”運算子操作來為下標方式訪問字串中具體的字元。另外,標準字串string類也提供了at()方法成員,以函式定義方式訪問字串中單個字元操作。string類中字串處理的方法原型如下。

上述string類提供的字元訪問操作都同時擁有兩個版本。一種是允許訪問並修改字串中字元的操作。另一種則是隻能以常量的方式訪問字串中字元,不允許呼叫者修改。至於具體程式使用哪種方式,需要根據實際應用場景作出選擇。

在以上的兩種方式中,實現的功能都是訪問並返回當前字串中指定位置的字元。其中,at()方法成員特別增加了為了防止訪問非法範圍的異常判斷,從而提供了所謂的訪問檢查。所以,at()方法更加安全。

讀者應該能夠聯想到前面類中運算子過載章節的字串封裝例項。C++允許自定義型別的優勢之一就在於允許根據需要自行封裝實現一些公共性操作類型別,從而供開發者在應用程式中使用。封裝實現的字串類中就提到下標操作符的封裝實現。下面同樣通過一個完整例項,演示訪問字串中字元的操作。

1.準備例項

開啟UE工具,建立新的空檔案並且另存為chapter1303.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。

本例項主要通過字串類提供的標準訪問字元介面,演示字串中訪問具體字元的操作功能。程式主要在主函式中完成,具體剖析見程式註釋與後面的講解。

2.編輯makefile

Linux平臺下需要編譯原始檔為chapter1303.cpp,相關makefile工程檔案編譯命令編輯如下所示。

上述makefile檔案套用前面的模板格式,主要替換了程式碼檔案、程式編譯中間檔案、可執行程式等。在編譯命令部分-g選項的加入,表明程式編譯同時加入了可調式資訊。

3.編譯執行程式

當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。

本例項主要演示了字串類string提供的訪問字串字元的操作運用情況。例項程式中首先定義字串物件mystring1,隨後給mystring1賦值,此時該字串內容為“string”。然後使用字串string的下標運算子訪問並修改字串mystring1中從0到4位置的字元。接著呼叫at方法訪問並修改字串第5個位置的字元。最後列印輸出字串mystring1中存放的字串值為“hell01”。

為體現常量下標以及常量at()方法的運用,定義常量字串mystring2並賦初值“hello”,即字串常量mystring2不能再作任何修改。隨後定義兩個字元變數ch1與ch2,通過字串常量mystring2下標操作訪問字串第3個字元,並將其返回值為字元ch1賦值。另外,通過呼叫at()方法訪問字串第4個字元返回並給ch2賦值。最後,列印輸出ch1與ch2字元變數中的獲取到的常量字串中指定位置的字元。

1.5  string 字串比較

比較運算介面主要有兩種方式來實現:第一種是通過過載實現比較運算子;第二種則是通過提供對外compare()方法實現字串比較操作。除了運算子過載實現的比較操作,下面給出string類中實現比較操作的方法成員原型定義。

上述定義中,compare()方法成員有多個過載版本實現。它們主要用於不同情況下字串比較操作。需要注意的是compare()方法的返回值。該方法實現的比較功能通過其返回值的判斷比較的運算元情況。當返回1時,表明運算元一大於運算元二;當返回-1時,表明運算元一小於運算元二;當返回值為0,則表明兩個運算元相等。下面將會照例通過一個完整例項來演示字串的比較操作。

1.準備例項

開啟UE工具,建立新的空檔案並且另存為chapter1304.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。

本例項主要通過標準字串類提供的介面,演示字串比較運算操作。程式主要在main函式內部實現,具體程式剖析見程式註釋與後面講解。

2.編輯makefile

Linux平臺下需要編譯原始檔為chapter1304.cpp,相關makefile工程檔案編譯命令編輯如下所示。

上述makefile檔案套用前面的模板格式,主要替換了程式碼檔案、程式編譯中間檔案、可執行程式等。在編譯命令部分-g選項的加入,表明程式編譯同時加入了可調式資訊。

3.編譯執行程式

當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。

本例項程式中主要演示了標準字串string類提供的兩種方式的比較操作介面。本例項在主程式中完成,下面將會將程式分為兩個部分來分別說明。

第一個部分說明字串物件通過if這樣的控制結構來進行比較操作。標準字串string類通過過載比較運算子的呼叫對比兩個字串mystring1與mystring2大小。使用if/elseif控制結構首先呼叫“!=”運算子過載操作判斷兩個字串內容。如果判斷為真則分開判斷兩個字串內容是否符合“>”運算子的運算,如果判斷為真則列印對應的資訊。

如果判斷為假,則判斷兩個字串是否符合“<”運算。如果符合,則列印對應資訊;否則,則跳出,執行對應的“==”比較判斷。判斷為真,則執行對應程式碼體;否則,程式繼續往下執行。由於mystring1字串對應的內容為“hello”,mystring2對應的字串內容為“string”,根據兩個字串對應的單個字元判斷。第一個字串’h’小於’s’,則比較結果為mystring1小於mystring2。列印對應的資訊為“mystring1 less than mystring2!”。

第二個部分演示了標準字串string類中的compare()方法成員完成字串比較的應用。首先定義字串物件mystring3並初始化值為“string”。程式碼“mystring3.compare(mystring2)”表明呼叫字串string類提供的方法compare(),將mystring2作為引數傳入進行比較並列印輸出其比較結果。由於此時兩個字串物件中內容一致,則列印輸出比較值為0。

程式碼“mystring3.compare(2,3,mystring2)”說明呼叫了compare()方法比較字串mystring3從第2位置開始往後3個字元組成的字串與mystring2,其比較結果列印輸出為-1,即新組成的字串小於mystring2字串值。

程式碼“mystring3.compare(1,3,mystring2,2,4)”說明呼叫了compare()方法比較了mystring3字串從位置1開始往後3個字元組成的字串與mystring2從位置2開始往後4個字元組成的字串,最後輸出比較結果為1。

此後的程式碼則是採用C語言中字串指標方式來演示上述標準字串string類相同操作實現。這裡就不用過多解釋了,提供的方法介面與字串物件處理同。

1.6  string 字串查詢與替換

標準字串string類提供了非常豐富的查詢方法。這裡主要以find方法實現為主,大致可以分為6種不同的方法函式定義。同時在6種不同的函式基礎上,每種方法根據不同需要又過載實現了4次,即總共為字串查詢操作定義實現了24個查詢方法介面,從而使得字串查詢操作非常豐富。下面就標準字串提供的24種字串查詢操作方法介面基本使用情況作出如下說明。

以上方法原型為標準字串string類針對字串查詢提供的功能介面。初學者在學習時需要掌握這樣一種方式,即根據提供的庫中方法介面的基本功能以及引數的說明,能夠正確的理解並在所開發的應用程式中正確呼叫。

從上述提供的24個字串查詢方法介面來看,根據不同的處理需求共分類4類。其中每種方式過載實現是根據同樣的需求而定義的介面。

q  第一類find方法,主要功能是在當前呼叫的字串中查詢對應的子串或字元。如果找到,則返回找到子串或者字元的起始位置的下標;否則,返回值為string::npos。它表示該查詢方法中無法在當前字串中查詢到對應的子串或者字元。

q  第二類rfind方法則表示查詢子串或者字元從當前的字串尾部開始逆向向前查詢。同樣,如果找到,則返回對應的下標位置;否則,返回string::npos值,表示無法找到對應的子串或字元。

q  第三類find_first_of方法表示在當前字串中查詢子串或者字元中任意一個字元首次找到的位置。找到,則返回;否則,返回值為string::npos,表示未找到。

q  第四類find_last_of方法則在當前字串中查詢對應的子串或字元中任意一個字元最後一次出現的位置。返回值同上,都是成功,則返回對應位置下標;否則返回string::npos值,表示未找到。

q  第五類方法find_first_not_of則表示在當前字串中查詢不包含傳入的子串或字元中的第一個字元,該查詢方法從頭開始,找到則返回對應的位置。

q  第六類find_last_not_of方法則提供功能與find_first_not_of方法相同,只是該方法是從字串的尾部開始查詢。

1.7  string 字串中插入字元

string類提供在字串中插入字元的操作。它主要由方法insert()來實現。該方法過載實現了多次,基本包含了大多數情況下的字串插入功能。字串插入操作的基本原型如下。

上述是7種insert方法介面過載的實現。字串插入方法介面基本說明已經在註釋中標註。下面將會通過一個完整字串插入操作例項,幫助讀者理解字串插入操作的實現。

1.準備例項

開啟UE工具,建立新的空檔案並且另存為chapter1305.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。

本例項主要通過標準字串類提供的insert介面,演示字串插入操作。程式主要在main函式內部實現,具體程式剖析見程式註釋與後面講解。

2.編輯makefile

Linux平臺下需要編譯原始檔為chapter1305.cpp,相關makefile工程檔案編譯命令編輯如下所示。

3.編譯執行程式

當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。

本例項中主要演示了字串插入操作介面的前4種應用。後面3種關於迭代器應用於字串插入操作介面的使用情況會放在STL模板章節介紹。例項依然在一個原始碼檔案中演示。主程式中首先定義兩個字串物件mystring1與mystring2,隨後分別給兩個字串物件賦值。

兩個字串物件定義並賦值初始化之後,字串物件mystring1呼叫插入方法insert(),根據傳入的實參(5,mystring2)決定了呼叫插入方法中的insert(size_type index,const string& str)。該方法表明在當前呼叫的字串mystring1第5個位置之前插入字串物件mystring2內容。此時列印輸出mystring1的內容為“helloC++”。

隨後字串物件mystring1呼叫insert()方法,直接通過傳入的字串常量實參插入到當前字串物件內容指定的位置之前。insert(5,”Linux”)方法呼叫表明在當前mystring1字串第5個位置前插入字串“Linux”。此時,mystring1列印輸出結果為“helloLinuxC++”。

mystring1字串物件呼叫insert(size_type index,size_type num,char ch)方法,根據傳入的實參從當前字串mystring1中第13個位置前插入2個’!’字元。最終輸出mystring1字串物件內容為“helloLinuxC++!!”。mystring2字串物件呼叫插入方法insert(),從當前字串mystring2第0個位置開始插入字串mystring1從第0位置後的5個字元,其結果輸出mystring2物件內容為“helloC++”。

相關文章