1. 程式人生 > >C++附加知識---string型別詳解

C++附加知識---string型別詳解

一、string簡介

  • 概念:string表示可變長的字元序列,string作為標準庫的一部分
  • 使用前需要匯入標頭檔案與名稱空間,string定義在std中
#include <string>
using std::string;

二、string物件的初始化

1.幾種初始化方式

string s1;  //預設初始化,s1是一個空串
string s2(s1);
string s2=s1;
string s3(s2);
string s3="value";
string s4(n,'c'); //初始化n個字元c

2.構造string的其他方法

//引數:1.陣列 2.長度(可省略)
string s(arr+2);//從arr陣列+2索引出構造到最後
string s(arr,n);//初始化arr陣列中的前n個字元

//引數:1.string物件 2.索引(可省略) 3.長度(可省略)
string s(s2,pos);//從s2物件的pos索引出開始構造一直到末尾
string s(s2,pos,len);//從s2的pos索引出構造len長度字串

2.直接初始化和拷貝初始化

  • 直接初始化:不使用=號來初始化一個變數
  • 拷貝初始化:使用=號來初始化一個變數

三、string物件的讀取

1.讀取規則:讀取string物件時,從第一個字元開始讀取,會自動忽略開頭的空白(空格符、製表符、換行符等...),遇到空白時就結束讀取

string s;
cin>>s;
cout<<s;
  • 上面的程式碼,如果程式輸入的是"  hello  world!  ",則輸出的結果是"hello",輸出結果中沒有空白

2.讀取未知數量的string物件

  • 可以通過while迴圈反覆讀取
string word;
while(cin>>word)//反覆讀取,直到讀取到檔案尾部
{
    cout<<word<<endl;
}

3.使用getline讀取一整行

  • ①概念:有時我們希望在讀取的字串中保留輸入時的空白符,這時可以使用getline函式代替原來的>>運算子
  • ②getline引數:引數1:一個輸入流  引數2:一個string物件
  • ③注意:函式從給定的輸入流中讀取內容,直到換行符為止(換行符也被讀進來了),然後把所讀的內容存入string物件中,但是這個string物件中不含有換行符
string line;
while(getline(cin,line))
{
    cout<<line<<endl;
}

四、strig物件的遍歷

1.通過[]運算子直接取值

string s1="HelloWorld";
cout<<s1[1];//'e'
cout<<s1[2];//'l'

2.for迴圈遍歷

string s="HelloWorld";
for(auto c:s)
{
    cout<<c<<endl;
}

五、string物件的相加、比較

1.+、=、==、!=等運算子操作

s1+s2;  //string物件相加
s1=s2;  //string物件賦值
s1==s2; //string物件比較
s1!=s2; //同上 

2.<、<=、>、>=等運算子操作

string比較運算子依照(大小寫敏感的)字典順序

string s1="Hello";
string s2="Hello world";
string s3="Hiya";

上述程式碼中,s2>s1,s3>s2,s3>s1

3.string物件的相加操作

注意(重點):string物件使用+運算子時,運算子的兩側必須有一個string型別的物件,不能是兩個字串字面值相加,否則會發生錯誤

string s1="Hello"+"World"; //錯誤

string s1="Hello";
string s2=s1+"World"; //正確
string s3=s2+"My"+"Name is";
//正確,前面的s2+"My"相加返回一個string型別物件,然後再於"Name is相加"

六、string函式

1.empty()、size() 

s.empty();//s為空返回true,否則返回false
s.size();//返回s中的字元個數

2.substr():擷取字串

引數:1.起始索引   2.終止索引(可省略,省略時一直擷取到物件結尾,不包括在內)

  • 只返回string物件,但不改變原string物件
string s("Hello World");
string s2=s.substr(0,5);//Hello
string s3=s.substr(6);//World

 3.insert()

功能:在string物件指定索引出插入新字串,引數多變

string s="HelloWorld";

s.insert(s.size(),5,'!');//在s的末尾插入5個'!'
s.insert(s.size(),"I am")//在末尾插入"I am"
s.insert(s.size(),s+5);//在s的末尾插入"World"
s.insert(s.size(),s+5,3);//在s的末尾插入"Wor";

4.assign()

功能: 將原string物件的內容更改為引數中指定的內容,引數多變

string s="HelloWorld";

string s2="My Name is"
s2.assign(s);//"HelloWorld"
s2.assign(s,0,5);//"Hello"
s2.assign(s,5);//"World"

5.append()

功能:在尾部追加內容

string s="HelloWorld";
string s2="I am Dong";

s.append("I am");
s.append(s2,2);//尾部追加"am Dong"
s.append(s2,2,2);//尾部追加"am"

6.replace()

功能: 替換string物件中的內容,引數多變,其中前兩個引數是一個更換索引範圍

string s="HelloWorld";
string s2="I am Dong ";
s.replace(0,5,s2);//s變為I am Dong World
s.replace(0,5,s2,5);//s變為Dong World
s.replace(0,5,s2,0,5);//s變為 I am World

7.erase()

功能: 刪除string物件內容,引數:1.起始索引 2.刪除長度(可省略,省略時刪除到末尾)

string s="HelloWorld";
s.erase(0,5);//刪除Hello
s.erase(5);//刪除World

8.compare()

功能:比較函式,與引數中的內容進行比較

  •  返回值: 等於返回0,大於返回正數,小於返回負數
string s="HelloWorld";
string s2="HelloWorld";
s.compare(s2);//返回0
s.compare(0,5,"World");//返回負數,從s0索引開始5個字元與引數3比較
s.compare(0,5,"I am Hello",5,5);//返回0,從s索引0開始的5個字元與引數3索引5開始的5個字元比較

char* arr = "Hello";
s.compare(arr);//返回0
s.compare(0, 5, arr);//返回0,從s索引0開始5個字元與arr比較
s.compare(0,5,arr+1,4);//返回負數,從s索引0開始5個字元與arr+1索引處的4個字元開始比較

9.查詢函式

 每次搜尋返回一個sitrng::size_type型別的索引。如果查詢失敗,返回npos(一個const string::size_type型別,值為-1)

s.find(args);  //查詢s中args第一次出現的位置
s.rfind(args); //查詢s中args最後一次出現的位置
s.find_first_of(args); //查詢s中args任何一個字元第一次出現的位置
s.find_last_of(args);  //查詢s中args任何一個字元最後出現的位置
s.find_first_not_of(args); //查詢s中第一個不在args中的位置
s.find_last_not_of(args);  //查詢s中最後一個不在args中的位置

引數args可以為下面的一種
c,pos    從s中pos索引處開始查詢字元c
s2,pos   從s中pos索引處查詢字串s2
cp,pos   從s中pos索引處查詢指標cp指向的字元/字串
cp,pos,n 從s中pos索引處查詢cp指向的陣列的前n個字元
string s("HellHeo");
auto pos1=s.find("He");//返回索引0
auto pos2=s.rfind("He");//返回索引4
string s1("012345");
string s2("a8c5");
auto pos=s2.find_first_of(s1);//返回1
//返回s2中第一個數字的索引
string number("0121345");
string s("5412Hello");
auto pos=s.find_first_not_of(number);//返回4
//返回s中第一個不是數字的字元索引

七、數值轉換函式

字串中常常包含表示數值的字元,如果獲取這些數值字元或者把數值變為字串,這時需要用到一些函式

//將數值轉換為字串,引數可以為:int,float....
to_string(val);

//返回字串的第一個整數子串
//引數:1.字串 2.儲存引數1中的第一個非數值字元下標(預設為0,可省略) 3.表示轉換所用的基數(可省略)
stoi(s,p,b); //返回值為int
stol(s,p,b); //返回值為long
stoul(s,p,b);//返回值為unsigned long
stoll(s,p,b);//返回值為long long
stolull(s,p,b);//返回值為unsigned long long

//返回字串中的第一個浮點數子串
//引數:1.字串 2.儲存引數1中的第一個非數值字元下標(預設為0,可省略)
stof(s,p);//返回值為float
stod(s,p);//返回值為double
stold(s,p);//返回值為long double
int i=42;
string s=to_string(i);//將整數42轉換為字串
double number=stod(s);//將字串s轉換為double
string s = "pi = 3.14";
double number = stod(s.substr(s.find_first_of("+-.01234")));
cout << number<< endl;//輸出3.14

原理:find_first_of函式先找到s中第一個為數字的索引,然後通過substr獲取"3.14",最後再用stod()函式轉換為double型別

八、處理string物件中的字元函式

概念:我們經常需要處理strinf物件中的字元,比如說檢查一個string物件是否含有空白、或者把string物件中的字母改成小寫、檢查是否有特定字元出現等等,這時我們需要使用一些特定的函式

  • 這些特定函式包含在<cctype>標頭檔案中
  • 引數是字元型別
isalnum(c);//當c字母或數字時為真
isalpha(c);//當c是字母時為真
iscntrl(c);//當c是控制字元時為真
isdigit(c);//當c是數字時為真

isgraph(c);//當c不是空格但可以列印時為真
isprint(c);//當c是可列印字元時為真(即c是空格或c具有可視形式)
ispunct(c);//當c是標點符號時為真(即c不是控制字元、數字、字母、可列印空白中的一種)
isspace(c);//當c是空白時為真(即c是空格、製表、回車、換行、進紙符中的一種)

isxdigit(c);//當c時十六進位制數字時為真
islower(c);//當c是小寫字母時為真
isupper(c);//當c是大寫字母時為真
tolower(c);//如果c是大寫字母,輸出對應的小寫字母ascii碼,否則原樣輸出
toupper(c);//如果c是小寫字母,輸出對應的大寫字母ascii碼,否則原樣輸出

九、string::size_type

概念:對於string物件的size()函式或者是string物件的索引,返回的是一個string::size_type型別的值,通過域操作符來表明size_type是在類string中的

  • 使用size_type一定要使用string域操作符
  • 因此我們在獲取size()函式的返回值時儘量避免使用int
string s="HelloWorld";
auto len=s.size(); //auto是一個string::size_type型別