針對字串處理,C++中並沒有專門的內建型別。C語言是使用字元陣列以及相應的指標來表示字串。前面章節已經介紹了C++包容的C語言字串處理方式。下面將講解C++標準庫封裝字串處理的字串類型別。通過庫提供的字串型別公開方法介面,開發者可以很方便地定義操作字串,使得操作字串變得方便簡易。
1.1 string 字串物件構造
C++庫中提供的字串標準類是通過模板定義來實現的。其中,模板類basic_string主要用於表示兩類字串操作:一種是目前應用程式中常用的string型別;另一種是支援寬型別的字元操作。目前本章所講述的是string型別。名稱空間std中string其實只是basic_string模板類的別名。如果採用typedef定義string作為basic_string字元型別例項類的別名,其定義語句如下。
1 |
typedef basic_string string;//定義模板類char型例項化類型別別名string |
其中,模板類basic_string通過char字元型例項化其型別,即此時處理的字串為char型。然後通過typedef關鍵字定義string為該類型別別名。這樣,開發者就可以直接把string作為其類型別操作。下面所講述的庫提供的字串類就是直接採用string名稱來說明。
C++標準庫字串類的物件例項定義時會涉及該類建構函式來實現構造。對於標準的字串類,標準庫提供了多個建構函式。開發者需要根據定義物件例項的方式,來決定呼叫哪個建構函式來構造字串物件例項。下面講解定義實現幾種字串物件構造例項,幫助讀者瞭解標準庫字串類所提供的字串物件構造方式。
1 2 3 4 5 6 7 |
string mystring1(“string”); //採用字串指標構造並初始化string(constchar *str) string mystring2(6,’a’);//採用指定數目的字元構造並初始化string(int n,char c); string mystring3;//直接呼叫字串無引數建構函式,構造一個空字串 string mystring4 = “string”;//直接呼叫字串類建構函式隱式執行轉換初始化 |
在定義中,字串類string提供了多種建構函式,實現了不同方式定義其物件例項並初始化。
q 第一種構造方式,通過傳入字串指標構造並初始化字串物件。
q 第二個則是通過傳入字元個數以及對應的字元來初始化既定個數字符的字串物件。
q 第三個則僅僅是通過建構函式來分配字串變數空間,暫時先不作任何初始化工作。
q 第四種方式是通過呼叫字串類建構函式隱式地去執行了轉換操作,給定義的字串物件賦值。
通常軟體開發中採用第三種構造方式。程式中僅僅先定義字串對應的物件,而賦值操作在實際應用中進行。字串類string使用時,要注意包含字串標準庫提供的標頭檔案#include。這樣可以在應用程式中具體的使用字串標準庫的介面。
1.2 string 字串賦值
C++標準庫字串類提供的字串賦值操作有多種操作介面可選擇。研究字串類標準定義可以看出,字串類賦值操作主要有兩種方式:一種利用賦值符號過載實現,即直接使用等於號的過載而實現。另一種是使用提供的assign()方法介面實現字串賦值操作。下面將會通過幾個賦值操作的例項,來講解標準字串類提供的賦值操作。
1.準備例項
開啟UE工具,建立新的空檔案並且另存為chapter1301.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/** * 例項chapter1301 * 原始檔chapter1301.cpp * 字串賦值操作 */ #include <iostream> #include <string> using namespace std; /*主函式入口*/ int main() { stringmystring1; //字串類物件mystring1定義 mystring1= "string"; //字串類物件mystring1賦值,存放字串“string” cout<<"mystring1value:"<<mystring1<<endl; //列印輸出字串物件mystring1的值 stringmystring2(mystring1); //字串物件mystring2定義,傳入mystring1初始化 cout<<"mystring2value:"<<mystring2<<endl; //列印輸出字串物件mystring2的值 stringmystring3; //字串物件mystring3定義 mystring3.assign(mystring1); //通過assign方法為mystring3物件賦值 cout<<"mystring3value:"<<mystring3<<endl; //列印輸出字串物件mystring3的值 mystring3.assign(mystring2,1,3); //通過assign方法將mystring2的值從1~3位擷取賦值 cout<<"mystring3value:"<<mystring3<<endl; //列印輸出字串物件mystring3的值 stringmystring4; //字串類物件mystring4定義 mystring4.assign(mystring1,1,string::npos); //通過assign方法將mystring1值從1到末尾擷取賦值 cout<<"mystring4value:"<<mystring4<<endl; //列印輸出字串物件mystring4的值 mystring4.assign("hello"); //通過assign方法將字串”hello”賦值給mystring4 cout<<"mystring4value:"<<mystring4<<endl; //列印輸出字串mystring4的值 stringmystring5; //字串類物件mystring5定義 mystring5.assign(4,'c'); //通過assign方法將4個字元’c’組合賦值給mystring5 cout<<"mystring5value:"<<mystring5<<endl; //列印輸出字串mystring5值 return0; } |
本例項主要通過標準字串類演示字串物件相互賦值的操作情況。程式主要在主函式中演示字串賦值操作,程式具體詳解見程式註釋與後面講解。
2.編輯makefile
Linux平臺下需要編譯原始檔為chapter1301.cpp,相關makefile工程檔案編譯命令編輯如下所示。
1 2 3 4 5 6 7 8 9 10 |
OBJECTS=chapter1301.o CC=g++ chapter1301: $(OBJECTS) $(CC)$(OBJECTS) -g -o chapter1301 clean: rm-f chapter1301 core $(OBJECTS) submit: cp-f -r chapter1301 ../bin cp-f -r *.h ../include |
上述makefile檔案套用前面的模板格式,主要替換了程式碼檔案、程式編譯中間檔案、可執行程式等。在編譯命令部分-g選項的加入,表明程式編譯同時加入了可調式資訊。
3. 編譯執行程式
當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[developer@localhost src]$ make g++ -c -ochapter1301.o chapter1301.cpp g++ chapter1301.o -g -o chapter1301 [developer@localhost src]$ make submit cp -f -r chapter1301 ../bin cp -f -r *.h ../include cp: cannot stat `*.h': No such file or directory make: *** [submit] Error 1 [developer@localhostsrc]$ cd ../bin [developer@localhostbin]$ ./chapter1301 mystring1 value:string mystring2 value:string mystring3 value:string mystring3 value:tri mystring4 value:tring mystring4 value:hello mystring5 value:cccc |
本例項中主要使用標準字串類定義字串物件,演示了標準字串類提供的幾種賦值方式的操作。程式中使用到字串類時,需要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 2 3 4 5 6 7 8 |
string operator+(const string &str); //將字串str連線到當前字串的尾部 string &operator+=(const string &str); //將字串str連線到當前字串尾部並賦值給當前字串變數 string &append(const char *str); //將char*表示的字串連線至當前字串尾部 string &append(const char *str,int n); //將char*表示的字串的前n個字元連線到當前字串尾部 string &append(const string &str); //將字串str連線至當前字串尾部,並賦值給當前字串 string &append(const string &str,intpos,int n); //將str從指定的pos位置開始後的n個字元連線到當前字串尾部 string &append(int n,char c); //將指定個數為n的字元c新增到字串尾部 string &append(const_iteratorfirst,const_iterator last); //將迭代器first到last之間的子串連線到當前字串尾部 |
根據標準字串類提供的連線介面,下面通過一個完整例項演示字串連線功能介面的應用情況。
1.準備例項
開啟UE工具,建立新的空檔案並且另存為chapter1302.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/** * 例項chapter1302 * 原始檔chapter1302.cpp * 字串連線操作 */ #include <iostream> #include <string> using namespace std; int main() { stringmystring1; //定義字串物件mystring1 mystring1= "string"; //初始化字串物件mystring1,初始值為字串”string” cout<<"mystring1value:"<<mystring1<<endl; //列印輸出字串物件mystring1的值 stringmystring2; //定義字串物件mystring2 mystring2= mystring1 + "123"; //字串物件mystring1與字串”123”通過’+’符號連線賦值 cout<<"mystring2value:"<<mystring2<<endl; //列印輸出字串物件mystring2的值 stringmystring3; //定義字串物件mystring3 mystring3+= mystring2; //通過’+=’符號將mystring2連線賦值給mystring3 cout<<"mystring3value:"<<mystring3<<endl; //列印輸出字串物件mystring3的值 mystring3.append("456"); //字串物件mystring3呼叫append方法追加字串”456” cout<<"mystring3value:"<<mystring3<<endl; //列印輸出字串物件mystring3的值 stringmystring4; //定義字串物件mystring4 mystring4.append("hello",4); //字串物件mystring4呼叫append方法,擷取”hello”前4位,進行追加 cout<<"mystring4value:"<<mystring4<<endl;//列印輸出字串物件mystring4的值 mystring4.append(mystring1);//mystring4呼叫append方法,追加mystring1的值 cout<<"mystring4value:"<<mystring4<<endl;//列印輸出字串mystring4的值 stringmystring5; //定義字串物件mystring5 mystring5.append(mystring1,2,3); //字串物件mystring5呼叫append方法,擷取mystring1的2位置起3個字元追加給mystring5 cout<<"mystring5value:"<<mystring5<<endl; //列印輸出字串物件mystring5的值 mystring5.append(2,'c'); //字串物件mystring5呼叫append方法,追加2個’c’字元給字串物件mystring5 cout<<"mystring5value:"<<mystring5<<endl; //列印輸出字串物件mystring5的值 return0; } |
本例項程式主要通過標準字串類提供的字串連線介面,演示字串連線的基本操作。程式主要在主函式中實現,具體程式剖析見程式註釋與後面的講解。
2.編輯makefile
Linux平臺下需要編譯原始檔為chapter1302.cpp,相關makefile工程檔案編譯命令編輯如下所示。
1 2 3 4 5 6 7 8 9 10 |
OBJECTS=chapter1302.o CC=g++ chapter1302: $(OBJECTS) $(CC)$(OBJECTS) -g -o chapter1302 clean: rm-f chapter1302 core $(OBJECTS) submit: cp-f -r chapter1302 ../bin cp-f -r *.h ../include |
上述makefile檔案套用前面的模板格式,主要替換了程式碼檔案、程式編譯中間檔案、可執行程式等。在編譯命令部分-g選項的加入,表明程式編譯同時加入了可調式資訊。
3.編譯執行程式
當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[developer@localhost src]$ make g++ -c -ochapter1302.o chapter1302.cpp g++ chapter1302.o -g -o chapter1302 [developer@localhost src]$ make submit cp -f -r chapter1302 ../bin cp -f -r *.h ../include [developer@localhostsrc]$ cd ../bin [developer@localhostbin]$ ./chapter1302 mystring1 value:string mystring2 value:string123 mystring3 value:string123 mystring3 value:string123456 mystring4 value:hell mystring4 value:hellstring mystring5 value:rin mystring5 value:rincc |
下面對程式碼依次進行介紹。
(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類中字串處理的方法原型如下。
1 2 3 4 |
char &operator[](int n) //字串string類提供過載下標操作符方法 const char &operator[](int n)const; //字串string類提供過載下標操作符方法,不同的是為常量訪問 char &at(int n); //字串string類提供訪問字串字元方法 const char &at(int n)const; //字串string類提供訪問字串字元方法,不同的是為常量訪問 |
上述string類提供的字元訪問操作都同時擁有兩個版本。一種是允許訪問並修改字串中字元的操作。另一種則是隻能以常量的方式訪問字串中字元,不允許呼叫者修改。至於具體程式使用哪種方式,需要根據實際應用場景作出選擇。
在以上的兩種方式中,實現的功能都是訪問並返回當前字串中指定位置的字元。其中,at()方法成員特別增加了為了防止訪問非法範圍的異常判斷,從而提供了所謂的訪問檢查。所以,at()方法更加安全。
讀者應該能夠聯想到前面類中運算子過載章節的字串封裝例項。C++允許自定義型別的優勢之一就在於允許根據需要自行封裝實現一些公共性操作類型別,從而供開發者在應用程式中使用。封裝實現的字串類中就提到下標操作符的封裝實現。下面同樣通過一個完整例項,演示訪問字串中字元的操作。
1.準備例項
開啟UE工具,建立新的空檔案並且另存為chapter1303.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/** * 例項chapter1303 * 原始檔chapter1303.cpp * 字串字元訪問 */ #include <iostream> #include <string> using namespace std; int main() { stringmystring1; //定義字串物件mystring1 mystring1= "string"; //初始化字串物件mystring1,初始化為字串"string" mystring1[0]= 'h'; //字串mystring1第一個位置賦值為字元’h’ mystring1[1]= 'e'; //字串mystring1第二個位置賦值為字元’e’ mystring1[2]= 'l'; //字串mystring1第三個位置賦值為字元’l’ mystring1[3]= 'l'; //字串mystring1第四個位置賦值為字元’l’ mystring1[4]= '0'; //字串mystring1第五個位置賦值為字元’0’ mystring1.at(5)= '1'; //字串mystring1第六個位置賦值為字元’1’ cout<<"mystring1value:"<<mystring1<<endl; //列印輸出字串mystring1的值 conststring mystring2 = "hello"; //定義字串常量物件mystring2,初始化值為”hello” charch1,ch2; //定義字元變數ch1、ch2 ch1= mystring2[3]; //將字串物件mystring2的第四個字元賦值給ch1 ch2= mystring2.at(4); //將字串物件mystring2的第五個字元賦值給ch2 cout<<"ch1value:"<<ch1<<" "<<"ch2value:"<<ch2<<endl; //列印字元變數ch1、ch2 return0; } |
本例項主要通過字串類提供的標準訪問字元介面,演示字串中訪問具體字元的操作功能。程式主要在主函式中完成,具體剖析見程式註釋與後面的講解。
2.編輯makefile
Linux平臺下需要編譯原始檔為chapter1303.cpp,相關makefile工程檔案編譯命令編輯如下所示。
1 2 3 4 5 6 7 8 9 10 |
OBJECTS=chapter1303.o CC=g++ chapter1303: $(OBJECTS) $(CC)$(OBJECTS) -g -o chapter1303 clean: rm-f chapter1303 core $(OBJECTS) submit: cp-f -r chapter1303 ../bin cp-f -r *.h ../include |
上述makefile檔案套用前面的模板格式,主要替換了程式碼檔案、程式編譯中間檔案、可執行程式等。在編譯命令部分-g選項的加入,表明程式編譯同時加入了可調式資訊。
3.編譯執行程式
當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。
1 2 3 4 5 6 7 8 9 10 |
[developer@localhost src]$ make g++ -c -ochapter1303.o chapter1303.cpp g++ chapter1303.o -g -o chapter1303 [developer @localhost src]$ make submit cp -f -r chapter1303 ../bin cp -f -r *.h ../include [developer @localhost src]$ cd ../bin [developer @localhost bin]$ ./chapter1303 mystring1 value:hell01 ch1 value:l ch2 value:o |
本例項主要演示了字串類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類中實現比較操作的方法成員原型定義。
1 2 3 4 5 6 |
int compare(const string &str); int compare(const char *str); int compare(size_type index,size_type length,conststring &str); int compare(size_type index,size_type length,constchar *str); int compare(size_type index1,size_type length1,conststring &str,size_type index2,size_type length2); int compare(size_type index1,size_type length1,constchar *str2,size_type index2,size_type length2); |
上述定義中,compare()方法成員有多個過載版本實現。它們主要用於不同情況下字串比較操作。需要注意的是compare()方法的返回值。該方法實現的比較功能通過其返回值的判斷比較的運算元情況。當返回1時,表明運算元一大於運算元二;當返回-1時,表明運算元一小於運算元二;當返回值為0,則表明兩個運算元相等。下面將會照例通過一個完整例項來演示字串的比較操作。
1.準備例項
開啟UE工具,建立新的空檔案並且另存為chapter1304.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/** * 例項chapter1304 * 原始檔chapter1304.cpp * 字串比較操作 */ #include <iostream> #include <string> using namespace std; int main() { stringmystring1,mystring2; //定義字串類物件mystring1與mystring2 mystring1= "hello"; //給字串物件mystring1初始化賦值 mystring2= "string"; //給字串物件mystring2初始化賦值 if(mystring1!= mystring2) //通過’!=’運算子比較兩個字串物件是否相等 { if(mystring1> mystring2) //通過’>’運算子比較兩個字串物件,比較哪個字串大 { cout<<"mystring1is large than mystring2!"<<endl; //列印輸出比較結果資訊 } elseif(mystring1 < mystring2) //通過’<’運算子比較兩個字串物件,比較哪個字串小 { cout<<"mystring1is less than mystring2!"<<endl; //列印輸出比較結果資訊 } } elseif(mystring1 == mystring2) //通過’==’運算子比較兩個字串物件是否恆相等 { cout<<"mystring1is equal mystring2!"<<endl; //列印輸出比較結果資訊 } stringmystring3; //定義字串類物件mystring3 mystring3= "string"; //給字串物件mystring3初始化賦值 cout<<"compare(conststring &str)const:" //在列印輸出中呼叫compare方法比較字串物件mystring2 <<mystring3.compare(mystring2)<<endl; //與mystring3,並輸出比較結果 cout<<"compare(intpos,int n,const string &str)const:" //在列印輸出中呼叫compare方法比較字串物件 <<mystring3.compare(2,3,mystring2)<<endl; // mystring2第2個位置後的3個字元組成的串與 //mystring3,並輸出比較結果 cout<<"compare(intpos1,int n1,const string &str,int pos2,int n2)const:" //在列印輸出中呼叫compare方法 <<mystring3.compare(1,3,mystring2,2,4)<<endl; //比較mystring3位置1往後3個字元組成的串與mystring2從位置2往後4個字元組成的串,並輸出比較結果 cout<<"compare(constchar *str):" //在列印輸出中呼叫compare方法比較常量字串 <<mystring3.compare("name")<<endl; //”name”與mystring3,並輸出比較結果 cout<<"compare(intpos,int n,const char *str)const:" //在列印輸出中呼叫compare方法比較常量字串 <<mystring3.compare(2,3,"name")<<endl; //”name”從位置2往後3個字元組成的串與 //mystring3,並輸出比較結果 cout<<"compare(intpos1,int n1,const char *str,int pos2,int n2)const:" //在列印輸出中呼叫compare方法 <<mystring3.compare(2,3,"name",1,2)<<endl; //比較常量字串”name”從位置1 //往後2個字元組成的串與mystring3從 //位置2往後3個字元組成的串,並輸出 //比較結果資訊 return0; } |
本例項主要通過標準字串類提供的介面,演示字串比較運算操作。程式主要在main函式內部實現,具體程式剖析見程式註釋與後面講解。
2.編輯makefile
Linux平臺下需要編譯原始檔為chapter1304.cpp,相關makefile工程檔案編譯命令編輯如下所示。
1 2 3 4 5 6 7 8 9 10 |
OBJECTS=chapter1304.o CC=g++ chapter1304: $(OBJECTS) $(CC)$(OBJECTS) -g -o chapter1304 clean: rm-f chapter1304 core $(OBJECTS) submit: cp-f -r chapter1304 ../bin cp-f -r *.h ../include |
上述makefile檔案套用前面的模板格式,主要替換了程式碼檔案、程式編譯中間檔案、可執行程式等。在編譯命令部分-g選項的加入,表明程式編譯同時加入了可調式資訊。
3.編譯執行程式
當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[developer@localhost src]$ make g++ -c -ochapter1304.o chapter1304.cpp g++ chapter1304.o -g -o chapter1304 [developer @localhost src]$ make submit cp -f -r chapter1304 ../bin cp -f -r *.h ../include [developer @localhost src]$ cd ../bin [developer @localhost bin]$ ./chapter1304 mystring1 is less than mystring2! compare(const string &str)const:0 compare(int pos,int n,const string&str)const:-1 compare(int pos1,int n1,const string &str,intpos2,int n2)const:1 compare(const char *str):1 compare(int pos,int n,const char *str)const:1 compare(int pos1,int n1,const char *str,intpos2,int n2)const:1 |
本例項程式中主要演示了標準字串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種字串查詢操作方法介面基本使用情況作出如下說明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//當前字串中查詢對應的子串或字元 size_type find(conststring &str,size_type index); size_type find(constchar *str,size_type index); size_type find(constchar *str,size_type index,size_type length); size_type find(charch,size_type index); //當前字串中查詢對應子串或字元,從字串的尾部開始查詢 size_type rfind(conststring &str,size_type index); size_type rfind(constchar *str,size_type index); size_type rfind(constchar *str,size_type index,size_type length); size_type rfind(charch,size_type index); //當前字串中查詢對應的子串或字元中任意一個字元首次出現的位置 size_type find_first_of(conststring &str,size_type index = 0); size_type find_first_of(constchar *str,size_type index = 0); size_type find_first_of(constchar *str,size_type index,size_type num); size_type find_first_of(charch,size_type index = 0); //當前字串中查詢對應的子串或字元中任意一個字元最後一次出現的位置 size_type find_last_of(conststring &str,size_type index = npos); size_type find_last_of(constchar *str,size_type index = npos); size_type find_last_of(constchar *str,size_type index,size_type num); size_type find_last_of(charch,size_type index = npos); //當前字串中查詢不包含對應的子串或字元中的第一個字元的位置,從字串前向後依次查詢 size_type find_first_not_of(conststring &str,size_type index = 0); size_type find_first_not_of(constchar *str,size_type index = 0); size_type find_first_not_of(constchar *str,size_type index,size_type num); size_type find_first_not_of(charch,size_type index = 0); //當前字串中查詢不包含對應的子串或字元中的第一個字元的位置,從字串尾部向前依次查詢 size_type find_last_not_of(conststring&str,size_type index = npos); size_type find_last_not_of(const char*str,size_type index = npos); size_type find_last_not_of(constchar *str,size_type index,size_type num); size_type find_last_not_of(charch,size_type index = npos); |
以上方法原型為標準字串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()來實現。該方法過載實現了多次,基本包含了大多數情況下的字串插入功能。字串插入操作的基本原型如下。
1 2 3 4 5 6 7 |
string& insert(size_type index,conststring& str); //當前字串位置index之前插入字串物件str string& insert(size_type index,const char*str); //當前字串位置index之前插入字串str string& insert(size_type index,size_typenum,char ch); //當前字串位置index之前插入num個字元ch string& insert(size_type index1,conststring& str,size_type index2,size_type num); //當前字串位置index1前插入字串str下標位置為index2往後的num個字元 iterator insert(iterator i,const char& ch); //當前字串迭代器i之前插入ch返回新元素的迭代器 void insert(iterator i,size_type num,constchar& ch); //當前字串迭代器i之前插入num個字元ch,無返回 void insert(iterator i,iterator start,iterator end); //當前字串迭代器i之前插入迭代器begin到end範圍內的元素,無返回 |
上述是7種insert方法介面過載的實現。字串插入方法介面基本說明已經在註釋中標註。下面將會通過一個完整字串插入操作例項,幫助讀者理解字串插入操作的實現。
1.準備例項
開啟UE工具,建立新的空檔案並且另存為chapter1305.cpp。該程式碼檔案隨後會同makefile檔案一起通過FTP工具傳輸至Linux伺服器端,客戶端通過scrt工具訪問操作。程式程式碼檔案編輯如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/** * 例項chapter1305 * 原始檔chapter1305.cpp * 字串插入字元操作 */ #include <iostream> using namespace std; int main() { stringmystring1,mystring2;//定義字串物件mystring1與mystring2 mystring1= "hello";//字串物件mystring1初始化賦值為”hello” mystring2= "C++"; //字串物件mystring2初始化賦值為”C++” mystring1.insert(5,mystring2);//字串物件mystring1呼叫insert方法,將當前 //mystring1字串第5個字元位置之前,插入 //mystring2字串 cout<<"afterinsert mystring2,mystring1's value:" //列印輸出此時mystring1的值 <<mystring1<<endl; mystring1.insert(5,"Linux"); //字串物件mystring1呼叫insert方法,將當前 //mystring1字串第5個字元位置之前,插入 //字串”Linux” cout<<"afterinsert \"Linux\",mystring1's value:" //列印輸出此時mystring1的值 <<mystring1<<endl; mystring1.insert(13,2,'!'); //字串物件mystring1呼叫insert方法,將當前 //mystring1字串第13個字元位置之前,插入 //2個’!’字元 cout<<"afterinsert \"!\",mystring1's value:"//列印輸出此時mystring1的值 <<mystring1<<endl; mystring2.insert(0,mystring1,0,5);//字串物件mystring2呼叫insert方法,在mystring2 //第0個位置上插入mystring1從0到位置5之間的字元 cout<<"afterinsert mystring1,mystring2's value:" //列印輸出此時mystring2的值 <<mystring2<<endl; return0; } |
本例項主要通過標準字串類提供的insert介面,演示字串插入操作。程式主要在main函式內部實現,具體程式剖析見程式註釋與後面講解。
2.編輯makefile
Linux平臺下需要編譯原始檔為chapter1305.cpp,相關makefile工程檔案編譯命令編輯如下所示。
1 2 3 4 5 6 7 8 9 10 |
OBJECTS=chapter1305.o CC=g++ chapter1305: $(OBJECTS) $(CC)$(OBJECTS) -g -o chapter1305 clean: rm-f chapter1305 core $(OBJECTS) submit: cp-f -r chapter1305 ../bin cp-f -r *.h ../include |
3.編譯執行程式
當前shell下執行make命令,生成可執行程式檔案,隨後通過make submit命令提交程式檔案至本例項bin目錄,通過cd命令定位至例項bin目錄,執行該程式檔案執行結果如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 |
[developer@localhost src]$ make g++ -c -ochapter1305.o chapter1305.cpp g++ chapter1305.o -g -o chapter1305 [developer @localhost src]$ make submit cp -f -r chapter1305 ../bin cp -f -r *.h ../include [developer @localhost src]$ cd ../bin [developer @localhost bin]$ ./chapter1305 after insert mystring2,mystring1's value:helloC++ after insert "Linux",mystring1'svalue:helloLinuxC++ after insert "!",mystring1'svalue:helloLinuxC++!! after insert mystring1,mystring2's value:helloC++ |
本例項中主要演示了字串插入操作介面的前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++”。