深入解析C 中的string類

2021-05-25 06:23:19 字數 2889 閱讀 9326

一,c語言的字串

在c語言裡,對字串的處理一項都是一件比較痛苦的事情,因為通常在實現字串的操作的時候都會用到最不容易駕馭的型別——指標。

比如下面這個例子:

//example 1:

char str[12] = "hello";

char *p = str;

*p = ''h'';  //改變第乙個字母

//example 2:

char *ptr = "hello";

*ptr = ''h'';  //錯誤

第乙個字串時用陣列開闢的,它是可以改變的變數。而第二個字串則是乙個常量,也就是字面值。ptr只是指向它的指標而已,而不能改變指向的內容。

看兩者的彙編即可明了:

char p = "hello";

004114b8  mov         eax,dword ptr [string "hello" (4166fch)]

004114bd  mov         dword ptr [ebp-10h],eax

004114c0  mov         cx,word ptr ds:[416700h]

004114c7  mov         word ptr [ebp-0ch],cx

char *ptr = "hello";

004114cb  mov         dword ptr [ebp-1ch],offset string "hello" (4166fch)

可見用陣列和用指標是完全不相同的。

要想通過指標來改變常量是錯誤,正確的寫法應該是用const指標。

const char *ptr = "hello";

二,初識string類

正是因為c風格字串(以空字元結尾的字元陣列)太過複雜難於掌握,不適合大程式的開發,所以c++標準庫定義了一種string類,定義在標頭檔案。注意和都是錯誤的,這兩個標頭檔案主要定義c風格字串操作的一些方法,譬如strlen(), strcpy()等。第乙個是c的頭檔案格式,而第二個是c++風格的標頭檔案,但是和是一樣的,它的目的是為了和c相容。

看下面例子:

//example 3:

string str("world");   //可以用c風格字串初始化

string words = "hello";

string greet = words;

string  join = greet + words;  //可以像基本型別一樣操作

但是如果試圖把string型別的物件直接賦給c風格的字串的話,編譯器會報錯的。

string var = "olympic";

char *ptr = var;  //error!

但是實際應用中這個問題也難以避免,很多時候我們還是需要將string型別的轉化為char*來實現自定義的操作,c++標準庫也為了和之前用c寫的程式相容,於是可以用string的c_str()函式。

string var = "olympic";

char *ptr = var.c_str(); //還不能被編譯

或者通過const_cast去掉其const屬性亦可

char *ptr=const_cast(var.c_str()); //correct!

這樣就可以通過ptr修改其指向的位址空間內容

但是c_str()為了防止意外地修改string物件,返回的是const指標,所以上面這段**是不能被編譯的。正確的應該是用const指標。

string var = "olympic";

const char *p = var.c_str(); //correct!

這個c_str()方法在c++io流操作上也被廣泛應用。

在開啟檔案時,如果要指定檔名,可以用c風格的字串。如果用到string型別的字串作為檔名時,就必須呼叫c_str()方法將其轉換為乙個c風格字串。

//example 4:

string   filename;  //定義檔名稱

cin >> filename;

ifstream.open(filename.c_str());  //要使用c風格字串

三, 深入了解string類

對string有一定了解以後,我們可以來了解c++標準庫定義的一系列豐富的字串操作,當然都是基於string型別。從某一種程度上來說,string就是一種字元容器。

比如插入,除了包括標準容器的插入方式以外,string類本身還有一些特有的插入方法。

//example 5:

//與標準容器相同的插入操作:

str.insert(iter, value) //在迭代器iter之前插入value, 返回新元素的迭代器

str.insert(iter, n, value); //在迭代器iter之前插入n個value,返回void

str.insert(iter, begin, end); //在迭代器iter之前插入迭代器begin和end標記範圍內的元素,返回void

//string類特有的插入方法:

str.insert(pos, n, ch); //在下標為pos的字元之前插入n個字元ch

str.insert(pos, str2); //在下標為pos的字元之前插入string型別的物件str2的副本

str.insert(pos1, str2, pos2, len); //在下標為pos1的z字元之前插入string型別str2中從下表為pos2開始的len個字元

str.insert(pos, cp); //在下標為pos的字元前插入字元指標cp指向的c風格字串的副本

總之string是一種非常靈活的字串型別,標準庫讓我們可以忽略記憶體管理和具體實現方式,我們只需要關注其介面就好。並且初學者在使用字串的時候也應盡量使用這種型別,而不是c風格的字串。

當然,無c語言學習經歷的人可以例外。

面試重點 String類的深入解析

string 字串,使用一對 引起來表示 1.string宣告為final的,不可被繼承 2.string實現了serializable介面 表示字串是支援序列化的 實現了comparable介面 表示string可以比較大小 3.string內部定義了final char value 用於儲存字串...

c 中string類的用法

前言 string類的常用方法有哪些?string查詢替換 分割字串 比較 擷取 型別轉換 排序等功能都提供了強大的處理函式,可以代替字元陣列來使用。熟練掌握好string的各種使用方法,能極大的提高程式設計效率哦 1.定義和構造初始化 string 提供了很多建構函式,可以以多種方式來初始化str...

C 中String類的實現

include include using namespace std class string else 拷貝建構函式 開闢跟源字串長度一樣長的空間給目標物件 string string s pstr new char strlen s.pstr 1 賦值運算子的過載 因為考慮到連續賦值的情況,故...