c++中string是標準庫中一種容器,相當於儲存元素型別為char的vector容器(自己理解),這個類提供了相當豐富的函式來完成對字串操作,以及與c風格字串之間轉換,下面是對string一些總結《引用》
一,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(); //還不能被編譯
但是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字串類成為乙個標準,
乙個c++字串存在三種大小:a)現有的字元數,函式是size()和length(),他們等效。 empty()用來檢查字串是否為空。b)max_size() 這個大小是指當前c++字串最多能包含的字元數,很可能和機器本身的限制或者字串所在位置連續記憶體的大小有關係。我們一般情況下不用關心他,應該大小足夠我們用的。但是不夠用的話,會丟擲length_error異常c)capacity()重新分配記憶體之前 string所能包含的最大字元數。這裡另乙個需要指出的是reserve()函式,這個函式為string重新分配記憶體。重新分配的大小由其引數決定,預設引數為0,這時候會對string進行非強制性縮減.
C 中String常用函式總結
1.string類提取子串函式 s.substr 返回s的全部內容 s.substr 11 從索引11往後的子串 s.substr 5,6 從索引5開始6個字元 2.string類的查詢函式 查詢成功時返回所在位置 第乙個字元索引 失敗返回string npos的值 int find char c,...
C 常用函式整理
記錄一些遇到的c 操作,作為個人筆記,便於查閱 1.memset 解釋 原型 常用形式 memset a src,0,sizeof a src 將陣列記憶體空間初始化,全部置為02.set 解釋 set的特性是,所有元素都會根據元素的鍵值自動排序,set的元素不像map那樣可以同時擁有實值 valu...
string中的常用函式
push back char c 在string 結尾放置字元 pop back 刪除字串的最後乙個字元,將其長度減少1 string 中使用 push back 效率很低,盡量使用 substr pos,n pos 表示要擷取的字串的起始位置,n表示要擷取的字串長度 substr pos 表示從p...