C++ string成員函式和cstring庫函式
首先是C字串:
C 庫函式 - strcmp() 比較2個C字串的字典序大小
描述
C 庫函式 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字串和 str2 所指向的字串進行比較。
宣告
下面是 strcmp() 函式的宣告。
int strcmp(const char *str1, const char *str2)
引數
- str1 -- 要進行比較的第一個字串。
- str2 --
返回值
該函式返回值如下:
- 如果返回值 < 0,則表示 str1 小於 str2。
- 如果返回值 > 0,則表示 str2 小於 str1。
- 如果返回值 = 0,則表示 str1 等於 str2。
例項
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret
if(ret < 0)
{
printf("str1 小於 str2");
}
else if(ret > 0)
{
printf("str2 小於 str1");
}
else
{
printf("str1 等於 str2");
}
讓我們編譯並執行上面的程式,這將產生以下結果:
str2 小於 str1
C 庫函式 - strchr()
描述
C 庫函式 char *strchr(const char *str, int c) 在引數 str 所指向的字串中搜索第一次出現字元 c(一個無符號字元)的位置。
宣告
下面是 strchr() 函式的宣告。
char *strchr(const char *str, int c)
引數
- str -- 要被檢索的 C 字串。
- c -- 在 str 中要搜尋的字元。
返回值
該函式返回一個指標,指向在字串 str 中第一次出現字元 c 的位置,如果未找到該字元則返回 空指標。
例項
下面的例項演示了 strchr() 函式的用法。
const char str[] = "http://www.runoob.com";
const char ch = '.';
char *ret;
ret = strchr(str, ch);
printf("|%c| 之後的字串是 - |%s|\n", ch, ret);
讓我們編譯並執行上面的程式,這將產生以下結果:
|.| 之後的字串是 - |.runoob.com|
C 庫函式 - strstr()
描述
C 庫函式 char *strstr(const char *haystack, const char *needle) 在字串 haystack 中查詢第一次出現字串 needle 的位置,不包含終止符 '\0'。
宣告
下面是 strstr() 函式的宣告。
char *strstr(const char *haystack, const char *needle)
引數
- haystack -- 要被檢索的 C 字串。
- needle -- 在 haystack 字串內要搜尋的小字串。
返回值
該函式返回在 haystack 中第一次出現 needle 字串的位置,如果未找到則返回 null。
例項
下面的例項演示了 strstr() 函式的用法。
const char haystack[20] = "RUNOOB";
const char needle[10] = "NOOB";
char *ret;
ret = strstr(haystack, needle);
printf("子字串是: %s\n", ret);
讓我們編譯並執行上面的程式,這將產生以下結果:
子字串是: NOOB
C 庫函式 - strcat()
描述
C 庫函式 char *strcat(char *dest, const char *src) 把 src 所指向的字串追加到 dest 所指向的字串的結尾。
宣告
下面是 strcat() 函式的宣告。
char *strcat(char *dest, const char *src)
引數
- dest -- 指向目標陣列,該陣列包含了一個 C 字串,且足夠容納追加後的字串。
- src -- 指向要追加的字串,該字串不會覆蓋目標字串。
返回值
該函式返回一個指向最終的目標字串 dest 的指標。
例項
下面的例項演示了 strcat() 函式的用法。
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strcat(dest, src);
printf("最終的目標字串: |%s|", dest);
讓我們編譯並執行上面的程式,這將產生以下結果:
最終的目標字串: |This is destinationThis is source|
C 庫函式 - sscanf()
描述
C 庫函式 int sscanf(const char *str, const char *format, ...) 從字串讀取格式化輸入。
宣告
下面是 sscanf() 函式的宣告。
int sscanf(const char *str, const char *format, ...)
引數
- str -- 這是 C 字串,是函式檢索資料的源。
- format -- 這是 C 字串,包含了以下各項中的一個或多個:空格字元、非空格字元 和 format 說明符。
format 說明符形式為 [=%[*][width][modifiers]type=],具體講解如下:
引數 |
描述 |
* |
這是一個可選的星號,表示資料是從流 stream 中讀取的,但是可以被忽視,即它不儲存在對應的引數中。 |
width |
這指定了在當前讀取操作中讀取的最大字元數。 |
modifiers |
為對應的附加引數所指向的資料指定一個不同於整型(針對 d、i 和 n)、無符號整型(針對 o、u 和 x)或浮點型(針對 e、f 和 g)的大小: h :短整型(針對 d、i 和 n),或無符號短整型(針對 o、u 和 x) l :長整型(針對 d、i 和 n),或無符號長整型(針對 o、u 和 x),或雙精度型(針對 e、f 和 g) L :長雙精度型(針對 e、f 和 g) |
type |
一個字元,指定了要被讀取的資料型別以及資料讀取方式。具體參見下一個表格。 |
sscanf 型別說明符:
型別 |
合格的輸入 |
引數的型別 |
c |
單個字元:讀取下一個字元。如果指定了一個不為 1 的寬度 width,函式會讀取 width 個字元,並通過引數傳遞,把它們儲存在陣列中連續位置。在末尾不會追加空字元。 |
char * |
d |
十進位制整數:數字前面的 + 或 - 號是可選的。 |
int * |
e,E,f,g,G |
浮點數:包含了一個小數點、一個可選的前置符號 + 或 -、一個可選的後置字元 e 或 E,以及一個十進位制數字。兩個有效的例項 -732.103 和 7.12e4 |
float * |
o |
八進位制整數。 |
int * |
s |
字串。這將讀取連續字元,直到遇到一個空格字元(空格字元可以是空白、換行和製表符)。 |
char * |
u |
無符號的十進位制整數。 |
unsigned int * |
x,X |
十六進位制整數。 |
int * |
- 附加引數 -- 這個函式接受一系列的指標作為附加引數,每一個指標都指向一個物件,物件型別由 format 字串中相應的 % 標籤指定,引數與 % 標籤的順序相同。
針對檢索資料的 format 字串中的每個 format 說明符,應指定一個附加引數。如果您想要把 sscanf 操作的結果儲存在一個普通的變數中,您應該在識別符號前放置引用運算子(&),例如:
int n;
sscanf (str,"%d",&n);
返回值
如果成功,該函式返回成功匹配和賦值的個數。如果到達檔案末尾或發生讀錯誤,則返回 EOF。
例項
下面的例項演示了 sscanf() 函式的用法。
int day, year;
char weekday[20], month[20], dtm[100];
strcpy( dtm, "Saturday March 25 1989" );
sscanf( dtm, "%s %s %d %d", weekday, month, &day, &year );
printf("%s %d, %d = %s\n", month, day, year, weekday );
讓我們編譯並執行上面的程式,這將產生以下結果:
March 25, 1989 = Saturday
C 庫函式 - sprintf()
描述
C 庫函式 int sprintf(char *str, const char *format, ...) 傳送格式化輸出到 str 所指向的字串。
宣告
下面是 sprintf() 函式的宣告。
int sprintf(char *str, const char *format, ...)
引數
- str -- 這是指向一個字元陣列的指標,該陣列儲存了 C 字串。
- format -- 這是字串,包含了要被寫入到字串 str 的文字。它可以包含嵌入的 format 標籤,format 標籤可被隨後的附加引數中指定的值替換,並按需求進行格式化。format 標籤屬性是 %[flags][width][.precision][length]specifier,具體講解如下:
specifier(說明符) |
輸出 |
c |
字元 |
d 或 i |
有符號十進位制整數 |
e |
使用 e 字元的科學科學記數法(尾數和指數) |
E |
使用 E 字元的科學科學記數法(尾數和指數) |
f |
十進位制浮點數 |
g |
自動選擇 %e 或 %f 中合適的表示法 |
G |
自動選擇 %E 或 %f 中合適的表示法 |
o |
有符號八進位制 |
s |
字元的字串 |
u |
無符號十進位制整數 |
x |
無符號十六進位制整數 |
X |
無符號十六進位制整數(大寫字母) |
p |
指標地址 |
n |
無輸出 |
% |
字元 |
flags(標識) |
描述 |
- |
在給定的欄位寬度內左對齊,預設是右對齊(參見 width 子說明符)。 |
+ |
強制在結果之前顯示加號或減號(+ 或 -),即正數前面會顯示 + 號。預設情況下,只有負數前面會顯示一個 - 號。 |
(space) |
如果沒有寫入任何符號,則在該值前面插入一個空格。 |
# |
與 o、x 或 X 說明符一起使用時,非零值前面會分別顯示 0、0x 或 0X。 |
0 |
在指定填充 padding 的數字左邊放置零(0),而不是空格(參見 width 子說明符)。 |
width(寬度) |
描述 |
(number) |
要輸出的字元的最小數目。如果輸出的值短於該數,結果會用空格填充。如果輸出的值長於該數,結果不會被截斷。 |
* |
寬度在 format 字串中未指定,但是會作為附加整數值引數放置於要被格式化的引數之前。 |
.precision(精度) |
描述 |
.number |
對於整數說明符(d、i、o、u、x、X):precision 指定了要寫入的數字的最小位數。如果寫入的值短於該數,結果會用前導零來填充。如果寫入的值長於該數,結果不會被截斷。精度為 0 意味著不寫入任何字元。 |
.* |
精度在 format 字串中未指定,但是會作為附加整數值引數放置於要被格式化的引數之前。 |
length(長度) |
描述 |
h |
引數被解釋為短整型或無符號短整型(僅適用於整數說明符:i、d、o、u、x 和 X)。 |
l |
引數被解釋為長整型或無符號長整型,適用於整數說明符(i、d、o、u、x 和 X)及說明符 c(表示一個寬字元)和 s(表示寬字元字串)。 |
L |
引數被解釋為長雙精度型(僅適用於浮點數說明符:e、E、f、g 和 G)。 |
- 附加引數 -- 根據不同的 format 字串,函式可能需要一系列的附加引數,每個引數包含了一個要被插入的值,替換了 format 引數中指定的每個 % 標籤。引數的個數應與 % 標籤的個數相同。
返回值
如果成功,則返回寫入的字元總數,不包括字串追加在字串末尾的空字元。如果失敗,則返回一個負數。
例項
下面的例項演示了 sprintf() 函式的用法。
char str[80];
sprintf(str, "Pi 的值 = %f", M_PI);
puts(str);
讓我們編譯並執行上面的程式,這將產生以下結果:
Pi 的值 = 3.141593
C++string:
1.宣告一個C++字串
宣告一個字串變數很簡單:
string Str;
這樣我們就聲明瞭一個字串變數,但既然是一個類,就有建構函式和解構函式。上面的宣告沒有傳入引數,所以就直接使用了string的預設的建構函式,這個函式所作的就是把Str初始化為一個空字串。String類的建構函式和解構函式如下:
a) string s; //生成一個空字串s
b) string s(str) //拷貝建構函式 生成str的複製品
c) string s(str,stridx) //將字串str內“始於位置stridx”的部分當作字串的初值
d) string s(str,stridx,strlen) //將字串str內“始於stridx且長度頂多strlen”的部分作為字串的初值
e) string s(cstr) //將C字串作為s的初值
f) string s(chars,chars_len) //將C字串前chars_len個字元作為字串s的初值。
g) string s(num,c) //生成一個字串,包含num個c字元
h) string s(beg,end) //以區間beg;end(不包含end)內的字元作為字串s的初值
i) s.~string() //銷燬所有字元,釋放記憶體
2.字串操作函式
a) =,assign() //賦以新值
b) swap() //交換兩個字串的內容
c) +=,append(),push_back() //在尾部新增字元
d) insert() //插入字元
e) erase() //刪除字元
f) clear() //刪除全部字元
g) replace() //替換字元
h) + //串聯字串
i) ==,!=,<,<=,>,>=,compare() //比較字串
j) size(),length() //返回字元數量
k) max_size() //返回字元的可能最大個數
l) empty() //判斷字串是否為空,是空時返回ture,不是空時返回false
m) capacity() //返回重新分配之前的字元容量
n) reserve() //保留一定量記憶體以容納一定數量的字元
o) [ ], at() //存取單一字元
p) >>,getline() //從stream讀取某值
q) << //將謀值寫入stream
r) copy() //將某值賦值為一個C_string
s) c_str() //將內容以C_string返回
t) data() //將內容以字元陣列形式返回
u) substr() //返回某個子字串
v)查詢函式
w)begin() end() //提供類似STL的迭代器支援
x) rbegin() rend() //逆向迭代器
y) get_allocator() //返回配置器
下面詳細介紹:
2.2 大小和容量函式
一個C++字串存在三種大小:a)現有的字元數,函式是size()和length(),他們等效。Empty()用來檢查字串是否為空。b)max_size() 這個大小是指當前C++字串最多能包含的字元數,很可能和機器本身的限制或者字串所在位置連續記憶體的大小有關係。我們一般情況下不用關心他,應該大小足夠我們用的。但是不夠用的話,會丟擲length_error異常c)capacity()重新分配記憶體之前 string所能包含的最大字元數。這裡另一個需要指出的是reserve()函式,這個函式為string重新分配記憶體。重新分配的大小由其引數決定, 預設引數為0,這時候會對string進行非強制性縮減。
2.3元素存取
我們可以使用下標操作符[]和函式at()對元素包含的字元進行訪問。但是應該注意的是操作符[]並不檢查索引是否有效(有效索引0~str.length()),如果索引失效,會引起未定義的行為。而at()會檢查,如果使用 at()的時候索引無效,會丟擲out_of_range異常。
有一個例外不得不說,const string a;的操作符[]對索引值是a.length()仍然有效,其返回值是'/0'。其他的各種情況,a.length()索引都是無效的。舉例如下:
const string Cstr(“const string”);
string Str(“string”);
Str[3]; //ok
Str.at(3); //ok
Str[100]; //未定義的行為
Str.at(100); //throw out_of_range
Str[Str.length()] //未定義行為
Cstr[Cstr.length()] //返回 ‘/0'
Str.at(Str.length());//throw out_of_range
Cstr.at(Cstr.length()) ////throw out_of_range
我不贊成類似於下面的引用或指標賦值:
char& r=s[2];
char* p= &s[3];
因為一旦發生重新分配,r,p立即失效。避免的方法就是不使用。
2.4比較函式
C ++字串支援常見的比較操作符(>,>=,<,<=,==,!=),甚至支援string與C-string的比較(如 str<”hello”)。在使用>,>=,<,<=這些操作符的時候是根據“當前字元特性”將字元按字典順序進行逐一得 比較。字典排序靠前的字元小,比較的順序是從前向後比較,遇到不相等的字元就按這個位置上的兩個字元的比較結果確定兩個字串的大小。同時,string (“aaaa”) <string(aaaaa)。
另一個功能強大的比較函式是成員函式compare()。他支援多引數處理,支援用索引值和長度定位子串來進行比較。他返回一個整數來表示比較結果,返回值意義如下:0-相等 〉0-大於 <0-小於。舉例如下:
string s(“abcd”);
s.compare(“abcd”); //返回0
s.compare(“dcba”); //返回一個小於0的值
s.compare(“ab”); //返回大於0的值
s.compare(s); //相等
2.5 更改內容
這在字串的操作中佔了很大一部分。
首先講賦值,第一個賦值方法當然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s=”gaint”)甚至單一字元(如:s='j')。還可以使用成員函式assign(),這個成員函式可以使你更靈活的對字串賦值。還是舉例說明吧:
s.assign(str); //不說
s.assign(str,1,3);//如果str是”iamangel” 就是把”ama”賦給字串
s.assign(str,2,string::npos);//把字串str從索引值2開始到結尾賦給s
s.assign(“gaint”); //不說
s.assign(“nico”,5);//把'n' ‘I' ‘c' ‘o' ‘/0'賦給字串
s.assign(5,'x');//把五個x賦給字串
把字串清空的方法有三個:s=””;s.clear();s.erase();。
string提供了很多函式用於插入(insert)、刪除(erase)、替換(replace)、增加字元。
先說增加字元(這裡說的增加是在尾巴上),函式有 +=、append()、push_back()。
舉例如下:
s+=str;//加個字串
s+=”my name is jiayp”;//加個C字串
s+='a';//加個字元
s.append(str);
s.append(str,1,3);//不解釋了 同前面的函式引數assign的解釋
s.append(str,2,string::npos)//不解釋了
s.append(“my name is jiayp”);
s.append(“nico”,5);
s.append(5,'x');
s.push_back(‘a');//這個函式只能增加單個字元對STL熟悉的理解起來很簡單
也許你需要在string中間的某個位置插入字串,這時候你可以用insert()函式,這個函式需要你指定一個安插位置的索引,被插入的字串將放在這個索引的後面。
s.insert(0,”my name”);
s.insert(1,str);
這種形式的insert()函式不支援傳入單個字元,這時的單個字元必須寫成字串形式,第二種形式指 出了使用迭代器安插字元的形式,在後面會提及。string有很多操作是使用STL的迭代器的。
刪除函式erase()的形式也有好幾種,替換函式replace()也有好幾個。
舉例吧:
string s=”il8n”;
s.replace(1,2,”nternationalizatio”);//從索引1開始的2個替換成後面的C_string
s.erase(13);//從索引13開始往後全刪除
s.erase(7,5);//從索引7開始往後刪5個
2.6提取子串和字串連線
題取子串的函式是:substr(),形式如下:
s.substr();//返回s的全部內容
s.substr(11);//從索引11往後的子串
s.substr(5,6);//從索引5開始6個字元
把兩個字串結合起來的函式是+。(誰不明白請致電120)
2.7輸入輸出操作
1.>> 從輸入流讀取一個string。
2.<< 把一個string寫入輸出流。
另一個函式就是getline(),他從輸入流讀取一行內容,直到遇到分行符或到了檔案尾:getline(cin,str);
2.8搜尋與查詢
查詢函式很多,功能也很強大,包括了:
find()
rfind()
find_first_of()
find_last_of()
find_first_not_of()
find_last_not_of()
這些函式返回符合搜尋條件的字元區間內的第一個字元的索引,沒找到目標就返回npos。所有的函式的引數說明如下:
第一個引數是被搜尋的物件。第二個引數(可有可無)指出string內的搜尋起點索引,第三個引數(可有可無)指出搜尋的字元個數。比較簡單,不多說不理解的可以向我提出,我再仔細的解答。當然,更加強大的STL搜尋在後面會有提及。
最後再說說npos的含義,string::npos的型別是string::size_type,所以,一旦需要把一個索引與npos相比,這個索引值必須是string::size)type型別的,更多的情況下,我們可以直接把函式和npos進行比較(如:if(s.find(“jia”)== string::npos))。
string類的建構函式:
string(const char *s); //用c字串s初始化
string(int n,char c); //用n個字元c初始化
此外,string類還支援預設建構函式和複製建構函式,如string s1;string s2="hello";都是正確的寫法。當構造的string太長而無法表達時會丟擲length_error異常
string類的字元操作:
const char &operator[](int n)const;
const char &at(int n)const;
char &operator[](int n);
char &at(int n);
operator[]和at()均返回當前字串中第n個字元的位置,但at函式提供範圍檢查,當越界時會丟擲out_of_range異常,下標運算子[]不提供檢查訪問。
const char *data()const;//返回一個非null終止的c字元陣列
const char *c_str()const;//返回一個以null終止的c字串
int copy(char *s, int n, int pos = 0) const;//把當前串中以pos開始的n個字元拷貝到以s為起始位置的字元陣列中,返回實際拷貝的數目
string的特性描述:
int capacity()const; //返回當前容量(即string中不必增加記憶體即可存放的元素個數)
int max_size()const; //返回string物件中可存放的最大字串的長度
int size()const; //返回當前字串的大小
int length()const; //返回當前字串的長度
bool empty()const; //當前字串是否為空
void resize(int len,char c);//把字串當前大小置為len,並用字元c填充不足的部分
string類的輸入輸出操作:
string類過載運算子operator>>用於輸入,同樣過載運算子operator<<用於輸出操作。
函式getline(istream &in,string &s);用於從輸入流in中讀取字串到s中,以換行符'\n'分開。
string的賦值:
string &operator=(const string &s);//把字串s賦給當前字串
string &assign(const char *s);//用c型別字串s賦值
string &assign(const char *s,int n);//用c字串s開始的n個字元賦值
string &assign(const string &s);//把字串s賦給當前字串
string &assign(int n,char c);//用n個字元c賦值給當前字串
string &assign(const string &s,int start,int n);//把字串s中從start開始的n個字元賦給當前字串
string &assign(const_iterator first,const_itertor last);//把first和last迭代器之間的部分賦給字串
string的連線:
string &operator+=(const string &s);//把字串s連線到當前字串的結尾
string &append(const char *s); //把c型別字串s連線到當前字串結尾
string &append(const char *s,int n);//把c型別字串s的前n個字元連線到當前字串結尾
string &append(const string &s); //同operator+=()
string &append(const string &s,int pos,int n);//把字串s中從pos開始的n個字元連線到當前字串的結尾
string &append(int n,char c); //在當前字串結尾新增n個字元c
string &append(const_iterator first,const_iterator last);//把迭代器first和last之間的部分連線到當前字串的結尾
string的比較:
bool operator==(const string &s1,const string &s2)const;//比較兩個字串是否相等
運算子">","<",">=","<=","!="均被過載用於字串的比較;
int compare(const string &s) const;//比較當前字串和s的大小
int compare(int pos, int n,const string &s)const;//比較當前字串從pos開始的n個字元組成的字串與s的大小
int compare(int pos, int n,const string &s,int pos2,int n2)const;//比較當前字串從pos開始的n個字元組成的字串與s中pos2開始的n2個字元組成的字串的大小
int compare(const char *s) const;
int compare(int pos, int n,const char *s) const;
int compare(int pos, int n,const char *s, int pos2) const;
compare函式在>時返回1,<時返回-1,==時返回0
string的子串:
string substr(int pos = 0,int n = npos) const;//返回pos開始的n個字元組成的字串
如string str; str.substr(i,n) 返回從i開始 n個字元組成的字串
string的交換:
void swap(string &s2); //交換當前字串與s2的值
string類的查詢函式:
int find(char c, int pos = 0) const;//從pos開始查詢字元c在當前字串的位置
int find(const char *s, int pos = 0) const;//從pos開始查詢字串s在當前串中的位置
int find(const char *s, int pos, int n) const;//從pos開始查詢字串s中前n個字元在當前串中的位置
int find(const string &s, int pos = 0) const;//從pos開始查詢字串s在當前串中的位置
//查詢成功時返回所在位置,失敗返回string::npos的值
int rfind(char c, int pos = npos) const;//從pos開始從後向前查詢字元c在當前串中的位置
int rfind(const char *s, int pos = npos) const;
int rfind(const char *s, int pos, int n = npos) const;
int rfind(const string &s,int pos = npos) const;
//從pos開始從後向前查詢字串s中前n個字元組成的字串在當前串中的位置,成功返回所在位置,失敗時返回string::npos的值
int find_first_of(char c, int pos = 0) const;//從pos開始查詢字元c第一次出現的位置
int find_first_of(const char *s, int pos = 0) const;
int find_first_of(const char *s, int pos, int n) const;
int find_first_of(const string &s,int pos = 0) const;
//從pos開始查詢當前串中第一個在s的前n個字元組成的數組裡的字元的位置。查詢失敗返回string::npos
int find_first_not_of(char c, int pos = 0) const;
int find_first_not_of(const char *s, int pos = 0) const;
int find_first_not_of(const char *s, int pos,int n) const;
int find_first_not_of(const string &s,int pos = 0) const;
//從當前串中查詢第一個不在串s中的字元出現的位置,失敗返回string::npos
int find_last_of(char c, int pos = npos) const;
int find_last_of(const char *s, int pos = npos) const;
int find_last_of(const char *s, int pos, int n = npos) const;
int find_last_of(const string &s,int pos = npos) const;
int find_last_not_of(char c, int pos = npos) const;
int find_last_not_of(const char *s, int pos = npos) const;
int find_last_not_of(const char *s, int pos, int n) const;
int find_last_not_of(const string &s,int pos = npos) const;
//find_last_of和find_last_not_of與find_first_of和find_first_not_of相似,只不過是從後向前查詢
string類的替換函式:
string &replace(int p0, int n0,const char *s);//刪除從p0開始的n0個字元,然後在p0處插入串s
string &replace(int p0, int n0,const char *s, int n);//刪除p0開始的n0個字元,然後在p0處插入字串s的前n個字元
string &replace(int p0, int n0,const string &s);//刪除從p0開始的n0個字元,然後在p0處插入串s
string &replace(int p0, int n0,const string &s, int pos, int n);//刪除p0開始的n0個字元,然後在p0處插入串s中從pos開始的n個字元
string &replace(int p0, int n0,int n, char c);//刪除p0開始的n0個字元,然後在p0處插入n個字元c
string &replace(iterator first0, iterator last0,const char *s);//把[first0,last0)之間的部分替換為字串s
string &replace(iterator first0, iterator last0,const char *s, int n);//把[first0,last0)之間的部分替換為s的前n個字元
string &replace(iterator first0, iterator last0,const string &s);//把[first0,last0)之間的部分替換為串s
string &replace(iterator first0, iterator last0,int n, char c);//把[first0,last0)之間的部分替換為n個字元c
string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之間的部分替換成[first,last)之間的字串
string類的插入函式:
string &insert(int p0, const char *s);
string &insert(int p0, const char *s, int n);
string &insert(int p0,const string &s);
string &insert(int p0,const string &s, int pos, int n);
//前4個函式在p0位置插入字串s中pos開始的前n個字元
string &insert(int p0, int n, char c);//此函式在p0處插入n個字元c
iterator insert(iterator it, char c);//在it處插入字元c,返回插入後迭代器的位置
void insert(iterator it, const_iterator first, const_iterator last);//在it處插入[first,last)之間的字元
void insert(iterator it, int n, char c);//在it處插入n個字元c
string類的刪除函式
iterator erase(iterator first, iterator last);//刪除[first,last)之間的所有字元,返回刪除後迭代器的位置
iterator erase(iterator it);//刪除it指向的字元,返回刪除後迭代器的位置
string &erase(int pos = 0, int n = npos);//刪除pos開始的n個字元,返回修改後的字串
string類的迭代器處理:
string類提供了向前和向後遍歷的迭代器iterator,迭代器提供了訪問各個字元的語法,類似於指標操作,迭代器不檢查範圍。
用string::iterator或string::const_iterator宣告迭代器變數,const_iterator不允許改變迭代的內容。常用迭代器函式有:
const_iterator begin()const;
iterator begin(); //返回string的起始位置
const_iterator end()const;
iterator end(); //返回string的最後一個字元後面的位置
const_iterator rbegin()const;
iterator rbegin(); //返回string的最後一個字元的位置
const_iterator rend()const;
iterator rend(); //返回string第一個字元位置的前面
rbegin和rend用於從後向前的迭代訪問,通過設定迭代器string::reverse_iterator,string::const_reverse_iterator實現
字串流處理:
通過定義ostringstream和istringstream變數實現,<sstream>標頭檔案中
例如:
string input("hello,this is a test");
istringstream is(input);
string s1,s2,s3,s4;
is>>s1>>s2>>s3>>s4;//s1="hello,this",s2="is",s3="a",s4="test"
ostringstream os;
os<<s1<<s2<<s3<<s4;
cout<<os.str();