一、string本質(zhì)
string是一個類,類似于java中的string類。利用string類可以定義其對應(yīng)的string對象。
二、string產(chǎn)生原因
C風(fēng)格字符串(以空字符結(jié)尾的字符數(shù)組)太過復(fù)雜難于掌握,不適合大程序的開發(fā),所以C++標(biāo)準(zhǔn)庫定義了一種string類,定義在頭文件。
注意:
·要使用string類要引入庫
·string首字母s就是小寫,不要大寫,和java不一樣
·string封裝了很多實用的成員方法
·string封裝了char,管理這個字符串,是一個char型的容器。
·不用考慮內(nèi)存釋放和越界
三、string容器的常用操作
1、string構(gòu)造函數(shù)
string();//創(chuàng)建一個空的字符串 例如: string str; string(const string& str);//使用一個string對象初始化另一個string對象 string(const char* s);//使用字符串s初始化 string(int n, char c);//使用n個字符c初始化
2、string基本賦值操作
string& operator=(const char* s);//char*類型字符串 賦值給當(dāng)前的字符串
string& operator=(const string &s);//把字符串s賦給當(dāng)前的字符串
string& operator=(char c);//字符賦值給當(dāng)前的字符串
string& assign(const char *s);//把字符串s賦給當(dāng)前的字符串
string& assign(const char *s, int n);//把字符串s的前n個字符賦給當(dāng)前的字符串
string& assign(const string &s);//把字符串s賦給當(dāng)前字符串
string& assign(int n, char c);//用n個字符c賦給當(dāng)前字符串
string& assign(const string &s, int start, int n);//將s從start開始n個字符賦值給字符 串
案例:
#include <iostream> #include <string> using namespace std; void test01() {
//string(const char* s);//使用字符串s初始化
string str1("hello world");
cout<<str1<<endl;
//string(int n, char c);//使用n個字符c初始化
string str2(5,'a');
cout<<str2<<endl;
//string& operator=(const char* s);//char*類型字符串 賦值給當(dāng)前的字符串
string str3;
str3 = "hello world";
string str4;
str4 = str3;
string str5;
str5 ='H';
cout<<str3<<endl;
cout<<str4<<endl;
cout<<str5<<endl;
string str6="hello wrold";
string str7;
str7.assign(str6, 2, 3);
cout<<str7<<endl;
string str8;
str8.assign("world", 4);
cout<<str8<<endl; }int main(){
test01() ;
return EXIT_SUCCESS; }
3、string存取字符操作
char& operator[](int n);//通過[]方式取字符 char& at(int n);//通過at方法獲取字符
案例:
#include <iostream> #include <string> using namespace std; void test02()
{
string str1="hello world";
cout<<str1[1]<<endl;
cout<<str1.at(1)<<endl;
str1[4]='H';
str1.at(1)='E';
cout<<str1<<endl;
//[] 訪問元素越界 不會拋出異常
//at 訪問元素越界 會拋出異常
try
{
//str1[1000]='H';
str1.at(1000)='H';
}
catch(exception &e)
{
cout<<e.what()<<endl;
}
cout<<"結(jié)束了"<<endl;
}int main(){
test02() ;
return EXIT_SUCCESS; }
4、string拼接操作
string& operator+=(const string& str);//重載+=操作符
string& operator+=(const char* str);//重載+=操作符
string& operator+=(const char c);//重載+=操作符
string& append(const char *s);//把字符串s連接到當(dāng)前字符串結(jié)尾
string& append(const char *s, int n);//把字符串s的前n個字符連接到當(dāng)前字符串結(jié)尾
string& append(const string &s);//同operator+=()
string& append(const string &s, int pos, int n);//把字符串s中從pos開始的n個字符連接到 當(dāng)前字符串結(jié)尾
string& append(int n, char c);//在當(dāng)前字符串結(jié)尾添加n個字符c
5、string查找和替換
int find(const string& str, int pos = 0) const; //查找str第一次出現(xiàn)位置,從pos開始查找 int find(const char* s, int pos = 0) const; //查找s第一次出現(xiàn)位置,從pos開始查找 int find(const char* s, int pos, int n) const; //從pos位置查找s的前n個字符第一次位置 int find(const char c, int pos = 0) const; //查找字符c第一次出現(xiàn)位置 int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,從pos開始查找int rfind(const char* s, int pos = npos) const;//查找s最后一次出現(xiàn)位置,從pos開始查找 int rfind(const char* s, int pos, int n) const;//從pos查找s的前n個字符最后一次位置 int rfind(const char c, int pos = 0) const; //查找字符c最后一次出現(xiàn)位置
string& replace(int pos, int n, const string& str); //替換從pos開始n個字符為字符串
str string& replace(int pos, int n, const char* s); //替換從pos開始的n個字符為字符串s
6、string比較操作
/*
compare函數(shù)在>時返回 1,<時返回 -1,==時返回 0。
比較區(qū)分大小寫,比較時參考字典順序,排越前面的越小。
大寫的A比小寫的a小。
*/int compare(const string &s) const;//與字符串s比較 int compare(const char *s) const;//與字符串s比較
7、string子串
string substr(int pos = 0, int n = npos) const;//返回由pos開始的n個字符組成的字符串
8、string插入和刪除操作
string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c);//在指定位置插入n個字符c
string& erase(int pos, int n = npos);//刪除從Pos開始的n個字符
9、string和c-style字符串轉(zhuǎn)換
//string 轉(zhuǎn) char*
string str = "itcast"; const char* cstr = str.c_str(); //char* 轉(zhuǎn) string char* s = "itcast";
string str(s);
案例:
#include <iostream> #include <string> using namespace std;
void test03()
{
string str1="hello";
str1.insert(2,"haha");
cout<<str1<<endl;
string str2="hello";
str2.insert(2,3,'a');
cout<<str2<<endl;
str2.erase(2,3);
cout<<str2<<endl;
cout<<str2.size()<<endl;
string str;
char *p = "hello";
//char * 轉(zhuǎn) string (可以)
str = p;
cout<<str<<endl;
string str5="hello";
//string 轉(zhuǎn) char * (不可以)
//const char *p1 = str5;//err
const char *p1 = str5.c_str();
cout<<p1<<endl;
}int main(){
test03() ;
return EXIT_SUCCESS; }
在c++中存在一個從const char到string的隱式類型轉(zhuǎn)換,卻不存在從一個string對象到C_string的自動類 型轉(zhuǎn)換。對于string類型的字符串,可以通過c_str()函數(shù)返回string對象對應(yīng)的C_string. 通常,程序員在整個程序中應(yīng)堅持使用string類對象,直到必須將內(nèi)容轉(zhuǎn)化為char時才將其轉(zhuǎn)換為C_string.
提示:為了修改string字符串的內(nèi)容,下標(biāo)操作符[]和at都會返回字符的引用。但當(dāng)字符串的內(nèi)存被重新分配之后,可能發(fā)生錯誤。
更多關(guān)于物聯(lián)網(wǎng)培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓(xùn)服務(wù)經(jīng)驗,采用全程面授高品質(zhì)、高體驗培養(yǎng)模式,擁有國內(nèi)一體化教學(xué)管理及學(xué)員服務(wù),助力更多學(xué)員實現(xiàn)高薪夢想。