簡介
string 表示可變長的字符序列,使用之前必須包含string頭文件 include < string >;
string對象中字符的處理—–對string中對象進行處理的的函數都在cctype 頭文件中定義 include < cctype>
size()函數返回string對象的長度,即string對象中字符的個數,如s1=”abc”,則個數爲3,不包括末尾的空字符;(5.8節還會學到)
- 下標操作符也是一個string: :size_type類型的值
========================================================================================================================
一、命名空間using的使用
- 我們使用的庫函數基本上都是屬於命名空間std,std::cin 表示從標準輸入中讀取內容。:: 作用域運算符的含義是從操作符的左側名字所示的作用域中尋找右側那個名字。
- 我們可以通過更簡單的途徑來使用命名空間中的成員,通過using 聲明;
- using std:cin 那我們就可以在命名空間std中獲取它,我們可以直接使用cin,而不用寫成std::cin來執行輸入,。
- 頭文件不應包含using 聲明
位於頭文件的代碼會拷貝到所有引用它的文件中去,如果頭文件裏有某個using 聲明,那麼每個使用了該頭文件的文件就都會有這個聲明。會產生始料未及的名字衝突。
二、標準庫類型string — 可變長的字符序列
前面介紹的內置類型是由C++語言直接定義的,這些類型,如數字和字符,體現了大多數計算機硬件本身具備的能力。標準庫定義了另外一組具有更高級性質的類型,他們尚未直接實現到計算機硬件中。
1. string 表示可變長的字符序列,使用之前必須包含string頭文件;
2. 作爲標準庫的一部分,string定義在命名空間std中。
**#include <string>**
**using std::string**
3. 定義和初始化string對象
string s1; //s1默認是空串
string s2(s1);
string s2=s1;
string s3("values")**;s3是values的副本,除了字面值最後的那個空字符串外**
string s3="values";
string s4(n,'c');
4. string 對象的操作
(1)讀寫string對象:從第一個真正字符(非空格、換行、製表符)開始,遇到空白停止
int main()
{
string s1;
cin>>s1;
cout<<s1<<endl;
return 0;}
//輸入 abc def
//結果:abc 因爲遇到空白就停止了,所以s1=”abc“;
//ctrl + z 表示輸入結束
//可以有多個輸入和多個輸出(常用的)
string s1,s2;
cin>>s1>>s2;
cout<<s1<<s2<<endl;
//輸入 abc def
//結果:abcdef
(2)讀取未知數目的string對象,就是多個string對象;
讀取未知數量的string對象和讀取未知數量的int一樣。
int main ()
{
string word;
while(cin>>word)
cout<<word<<endl;
return 0;
}
//輸入:dec def ede
//輸出:dec def ede
(3)使用getline(cin,s1)讀取一整行,通過getline函數,我們可以得到字符串中保留輸入時的空白符。一行一行的讀,遇到換行符結束。
int main()
{
string line;
while(getline(cin,line))
cout<<line<<endl;
}
//輸入 abc cde edf
//輸出 abc cde edf
(4)string中的empty和size操作
empty()用來判斷是否爲空。
size()函數返回string對象的長度,即string對象中字符的個數,如s1=”abc”,則個數爲3;
(5)string::size_type類型
對於size函數來說,其返回值類型是一個string::size_type 類型的值;
string 類型及其他大多數標準庫類型都定義了幾種配套的類型,這些類型體現了標準庫類型與機器無關的特性,size_type 就是其中的一種。在具體使用的時候,通過作用域操作符來表明名字size_type是在類string中定義的。
size_type 是一種unsigned 類型的值,而且能夠放下任何string對象的大小。
所有用於存放string類的size函數返回值的變量,都應該是string: : size_type類 型的
- 因爲size 函數返回的是無符號類型的,所以在表達式中最好不要混用帶符號和無符號數,在一個表達式中如果有size ()函數了,就不要再使用int 了。
(6)比較string對象大小
(注意:大小和長度不一樣,長度是用size函數的,大小就直接用關係運算符進行比較)
a. 比較兩個string對象通過關係運算符 > < >= == ;
b. 如果兩個string對象長度不同,且較短的string對象的每個字符都與較長string對象對應位置上的字符相同,就說較短string對象小於較長string對象;
c. 如果兩個string對象在某些對應的位置上不一致,則string對象比較結果其實是string對象中第一對相異字符比較的結果。
(7)爲string對象賦值
(8)兩個string對象相加
兩個string對象的相加其實就是string對象的串接
int main ()
{
string result_str,str;
while(cin>>str)
{result_str=result_str+str;}
cout<<result_str<<endl;
return 0;
}
//輸入:abc cde efg (ctrl+z結束)
//輸出:abccdeefg
(9)字面值與string對象的相加
字符串和string是不同的類型!!!!!!!!!!
當把string對象和字符字面值及字符串字面值混在一條語句中使用時,必須確保每個加法運算符的兩側的運算對象至少有一個是string。
string s2=s1+"," //可以
string s3="hello " +" , " //不可以
string s4=s2+","+"world" //可以
string s5="hello"+","+s2 // 不可以
(10)數字不能與string對象的相加
5.string對象獲取字符
(1)通過下標操作獲取字符
string類型通過下標操作符來訪問string對象中的字符。下標操作符也是一個size_type類型的值,這個下標中的值稱爲“索引”或“下標”,所以這裏的索引是unsigned類型的string : : size_type;
string對象的下標都是從0開始的(所以前提就是s 非空)
如果s 是一個string對象且 s 不爲空,則s[0] 就是字符串的第一個字符,s[1] 表示第二個,而s[s.size()-1]則表示最後一個。
int main ()
{
string str("some string");
for(string::size_type ix=0;ix<str.size();ix++)
{cout<<str[ix]<<endl;}
return 0;
}
//下面這樣操作是錯誤的,因爲str1是空的!!!
string str1;
cout<<str1[0]<<endl;
(2)string對象中字符的處理
對string中對象進行處理的的函數都在cctype 頭文件中定義 include
常見的函數有 isalnum,isalpha,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace
int main ()
{
string str("some string!!!!!!");
string::size_type punct_cnt=0;
for(string::size_type ix=0;ix<str.size();ix++)
{
if(ispunct(str[ix])) //這個是得到string對象中標點符號個數的函數
punct_cnt++;
}
cout<< punct_cnt<<endl;
return 0;
}
//編一個程序,從string 對象中去掉標點符號。要求輸入到程序的字符串必須含
//有標點符號,輸出結果則是去掉標點符號後的string 對象。
int main ()
{
string result_str,str;
while(cin>>str) //用while實現
{ for(string::size_type i=0;i!=str.size();i++)
if (!ispunct(str[i]))
result_str=result_str+str[i];
}
cout<<result_str<<endl;
return 0;
}
string result_str,str;
getline(cin,str); //用getline實現
{ for(string::size_type i=0;i!=str.size();i++)
if (!ispunct(str[i]))
result_str=result_str+str[i];
}