頭文件: #include <string>
一、string對象的定義:
string s1; //構造字符串s1
string s2(s1); //把字符串s1值賦給字符串s2
string s1("wuyang"); //構造字符串s1,且s1爲wuyang
string s1(n,'w'); //構造字符串s1,且s1爲n個w
cin >> s1; //輸入字符串s1,但是不讀入空格和換行
getline(cin,s1); //輸入字符串s1,讀入空格但是不讀入換行
getline(cin,s1,'w'); //輸入字符串s1,讀入空格和換行,直到遇到w
二、string的一些操作
s1.empty(); //判斷s1爲是否爲空 爲空返回真,否則返回假
s1.size(); //求字符串s1的長度
//注意:s1.size()返回的值並不是int類型
s1.length(); //求字符串s1長度
s1[n]; //代表字符串s1中第n+1位的字符
s1.append("abc"); //在字符串尾部添加字符串
s1+s2; //將s2連接到s1後面(連接了s1,s2)
//注意:s1+'w'+'y'這種相加是允許的。但是'w'+'y'+s1是錯誤的
s1=s2; //把s2的值賦給s1
s1==s2; //判斷s1,s2是否相等,相等爲真
來展示一段代碼幫助理解:
int main()
{
string s1("123");
cout << "字符串s1初始值爲: " << s1 << endl;
string s2("456");
s1.append("abc");
cout << "字符串s1爲: " << s1 << endl;
cout << "s1+s2結果爲" << s1+s2 << endl ;
while(!s1.empty())
{
string::size_type i; //這裏i要定義成size_type類型
for(i=0; i!=s1.size();i++) //s1.size()表示s1的字符長度
{
cout<<s1[i];
}
cout<<endl;
break;
}
return 0;
}
三、對string中字符的處理:
isalnum(c); //字符c如果是字母或數字,返回真
isdigit(c); //字符c如果是數字,返回真
isxdigit(c);//字符c是十六進制數,返回真
isalpha(c); //字符c如果是字母,返回真
islower(c); //字符c如果是小寫字母,返回真
isupper(c); //字符c如果是大寫字母,返回真
tolower(c); //字符c是大寫字母,返回其小寫,否則返回c
toupper(c); //字符c是小寫字母,返回其大寫,否則返回c
isgraph(c); //字符c是可打印字符(不可是空格),返回真
isprint(c); //字符c是可打印字符(可以是空格),返回真
iscntrl(c); //字符c是控制符,返回真
ispunct(c); //字符c是標點符,返回真
isspace(c); //字符c是空格符,返回真
下面展示一段代碼
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main()
{
string s1("123abc. >@");
cout << "字符串s1爲: " << s1 << endl << endl;
string::size_type i;
for(i=0;i<s1.size();i++)
{
if(isgraph(s1[i]))
cout << s1[i] << " ";
if(isdigit(s1[i]))
cout << "數字 " << endl;
if(isalpha(s1[i]))
{
cout << "字母" ;
if(islower(s1[i]))
cout << "(小寫字母)" << endl;
if(isupper(s1[i]))
cout << "(大寫字母) " << endl;
}
if(ispunct(s1[i]))
cout << "標點符 " << endl;
if(isspace(s1[i]))
cout << " 空格符" << endl;
}
return 0;
}
四、string與數值的相互轉換
頭文件: #include <sstream>
C++引入了ostringstream、istringstream、stringstream這三個類,要使用他們創建對象就必須包含sstream.h頭文件。
istringstream //用於執行C++風格的串流的輸入操作。
ostringstream //用於執行C風格的串流的輸出操作。
stringstream //同時可以支持C風格的串流的輸入輸出操作。
代碼:
方法一 這是C的方法 用到了sprintf
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
char b[10];
string a;
sprintf(b,"%d",1975); //數值轉化爲string
a=b;
cout<<a;
}
方法二 用到#include <sstream>
// 數字轉換成字符
#include <iostream>
#include <string>
#include <cstdio>
#include <sstream>
using namespace std;
int main()
{
double x;
x=1975;
ostringstream o;
o<<x;
cout << o.str();
return 0;
}
//字符轉換成數字
#include <iostream>
#include <string>
#include <cstdio>
#include <sstream>
using namespace std;
int main()
{
string s1("7569");
double x;
x=1975;
istringstream o(s1);
o>>x;
cout << x;
return 0;
}
五、字符的插入,刪除,替換,查找
首先要作如下操作
string s1="abc123def";
string::iterator it; //定義迭代器
1.插入
it=s1.begin(); //表示迭代器的位置(這裏是s1的第一個元素)
s1.insert(it+1,'s'); //迭代器所在位置後一位上的元素前插入‘s’
cout << s1 << endl;
2.刪除
it=s1.begin(); //表示迭代器的位置(這裏是s1的第一個元素)
s1.erase(it+1); //表示刪除迭代器位置後一位上的元素
//s1.erase(it,it+1); //表示刪除it到it+1間的元素
cout << s1 << endl;
3.替換s1.replace(pos,num,char* a);
pos 代表下標,num代表元素個數,char* a代表要替換成的元素
string s1="abc1234..<<@@";
s1.replace(3,4,"good"); //從下標3開始連續四個元素替換爲good
cout<<s1<<endl;
來變一段代碼幫助理解以上三個操作
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
string s1="abc1234..<<@@";
s1.replace(pos,num,char* c);
string::iterator it; //定義一迭代器
s1.replace(3,4,"good"); //從下標3開始連續四個元素替換爲good
cout<<s1<<endl;
it=s1.begin(); //表示迭代器的位置(這裏是s1的第一個元素)
s1.insert(it+1,'p'); //迭代器所在位置後一位上的元素前插入‘s’
cout << s1 << endl;
it=s1.begin(); //表示迭代器的位置(這裏是s1的第一個元素)
s1.erase(it+1); //表示刪除迭代器所在位置後一位上的元素
cout << s1 << endl;
return 0;
}
查找
s1.find('c'); //返回第一個'c'的下標
s1.find("abc"); //返回第一個"abc"的下標
s1.find('c',pos); //從下標pos開始返回第一個'c'的下標
s1.find("abc",pos); //從下標pos開始返回第一個'abc'的下標
s1.rfind('c'); //從後往前第一個'c'的下標
s1.rfind("abc"); //從後往前第一個"abc"的下標
s1.rfind('c',pos); //從下標pos開始從後往前第一個'c'的下標
s1.rfind("abc",pos);//從下標pos開始從後往前第一個"abc"的下標
s1.find("abc",pos,n);
//從下標pos開始,返回子串中前n個子串在s1中的位置
s1.rfind("abc",pos,n);
//從下標pos開始,從前往後查找,返回子串中前n個子串在s1中的位置
編寫一段代碼
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
string s1="123abc1234..<<@@abc12abc123abc123abc123abc";
int pos,n;
cout << "第一個c的下標是:" << s1.find('c') << endl;
cout << "第一個abc的下標是: " << s1.find("abc") << endl;
cout << "從後往前第一個c的下標是:" << s1.rfind('c') << endl;
cout << "從後往前第一個abc的下標是: " << s1.rfind("abc") << endl;
cin >> pos ;
cout << "從下標pos開始第一個'c'的下標是: " << s1.find('c',pos) << endl;
cout << "從下標pos開始第一個abc的下標是: " << s1.find("abc",pos) << endl;
cout << "從下標pos開始從後往前第一個c的下標是: " << s1.rfind('c',pos) <<endl;
cout << "從下標pos開始從後往前第一個abc的下標是: " << s1.rfind("abc",pos) << endl;
cin >> n;
cout << "從下標pos開始,子串中前n個子串在s1中的位置是: " <<s1.find("abc",pos,n) << endl;
cout << "從下標pos開始,從後往前查找,子串中前n個子串在s1中的位置是: " <<s1.rfind("abc",pos,n) << endl;
return 0;
}