c++学习--string类详解
1.构造函数
string类有多个构造函数,具体如下:
1.string s1(“Hello”); //s1=“Hello”
2.string s2 = “March”; //s2=“March”
3. string s3(4,’x’); //s3=“xxxx”
4. string s4(“12345”,1,3);//s4=“234”
错误的初始化方法:
string error1 = ‘c’; // 错
string error2(‘u’); // 错
string error3 = 22; // 错
string error4(8); // 错
2. string对象赋值
-
用 = 赋值
string s1(“cat”), s2;
s2 = s1;
s2=‘K’ //s2=“k”,可以将字符赋值给string对象 -
用 assign 成员函数复制
string s1(“cat”), s3;
s3.assign(s1);
s3.assign(s1, 1, 2)==s3=s1.substr(1,2); //从s1 中下标为1的字符开始复制2个字符给s3
s3.assign(4,‘k’); //s3=‘kkkk’ -
单个字符复制
s2[5] = s1[5] ; -
逐个访问string对象中的字符
string s1("Hello");
for(int i=0;i<s1.length();i++)
cout << s1.at(i) << endl;
成员函数at会做范围检查,如果超出范围,会抛出
out_of_range异常,而下标运算符[]不做范围检查。
- string 支持流读取运算符
string stringObject;
cin >> stringObject; //==scanf(“%s”,s1) - string 支持getline函数
string s;
getline(cin ,s); //==gets(s1);
3. string的连接
- 用 + 运算符连接字符串
string s1("good "), s2("morning! ");
s1 += s2;//s1==goodmorning! - 用成员函数 append 连接字符串
string s1("good "), s2("morning! ");
s1.append(s2); //s1==goodmorning!
s2.append(s1, 3, s1.size());// 下标为3开始,s1.size()个字符,如果字符串内没有足够字符,则复制到字符串最后一个字符
s1.append(3,‘k’);
4.string对象的比较
- 用关系运算符比较string的大小
== , >, >=, <, <=, !=
返回值都是bool类型,成立返回true, 否则返回false
例如:
string s1(“hello”),s2(“hello”),s3(“hell”);
bool b = (s1 == s2); //b==true
b = (s1 == s3); //b=false
b = (s1 > s3); //b=true - 用成员函数compare比较string的大小
compare成员函数有以下返回值:小于0表示当前字符串小;等于0表示两个字符串相等;大于0表示当前字符串大
string s1("hello"),s2("hello"),s3("hell");
int f1 = s1.compare(s2);//比较s1与S2,f1==0
int f2 = s1.compare(1,2,s3,0,3); //s1的1-2与s3的0-3,f2==-1,el<hell
int f3 = s1.compare(0,s1.size(),s3);//hello>hell
5.交换两个string对象的内容
string s1("hello world"), s2("really");
s1.swap(s2);
6.查找子串和字符
- 成员函数 find()
string s1("hello world");
s1.find("lo");
s1.find("lo",1);//从下标1开始查找
在s1中从前向后查找 “lo” 第一次出现的地方,如果找到,返回 “lo”开始的位置,即 l 所在的位置下标。如果找不到,返回string::npos (string中定义的静态常量)
- 成员函数 rfind()
string s1("hello world");
s1.rfind("lo");
在s1中从后向前查找 “lo” 第一次出现的地方,如果找到,返回 “lo”开始的位置,即 l 所在的位置下标。如果找不到,返回string::npos 。
- 成员函数 find_first_of()
string s1("hello world");
s1.find_first_of(“abcd");
在s1中从前向后查找 “abcd” 中任何一个字符第一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos。
- 成员函数 find_last_of()
string s1("hello world");
s1.find_last_of(“abcd");
在s1中查找 “abcd” 中任何一个字符最后一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos。
- 成员函数 find_first_not_of()
string s1("hello world");
s1.find_first_not_of(“abcd");
在s1中从前向后查找不在 “abcd” 中的字母第一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos。
- 成员函数 find_last_not_of()
string s1("hello world");
s1.find_last_not_of(“abcd");
在s1中从后向前查找不在 “abcd” 中的字母第一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos。
7.删除string中的字符
string s1("hello worlld");
s1.erase(1,3);//删除子串(1,3)s1="ho worlld"
s1.erase(5);//删除下标5及其后面的所有字符
8.替换string中的字符
string s1("hello world");
s1.replace(2,3, “haha");//将s1中下标2 开始的3个字符换成“haha”
s1.replace(2,3, “haha",0,2);//将s1中下标2 开始的3个字符换成“haha”中下标0开始的2个字符
9.在string中插入字符
string s1("hello world");
string s2(“show insert");
s1.insert(5,s2); // 将s2插入s1下标5的位置
cout << s1 << endl;
s1.insert(2,s2,5,3);
//将s2中下标5开始的3个字符插入s1下标2的位置
cout << s1 << endl;
10.string转换成C语言式char *字符串
string s1("hello world");
printf("%s\n", s1.c_str());
// s1.c_str() 返回传统的const char * 类型字符串,且该字符串以‘\0’结尾。
11.字符串拷贝
string s1("hello world");
int len = s1.length();
char * p2 = new char[len+1];
s1.copy(p2,5,0);
p2[5]=0;
cout << p2 << endl;
// s1.copy(p2,5,0) 从s1的下标0的字符开始制作一个最长5个字符长度的字符串副本并将其赋值给p2。返回值表明实际复制字符串的长度。
12.字符串流处理
使用流对象istringstream和ostringstream,可以将string对象当作一个流进行输入与输出。使用时必须包含头文件sstream。
- 字符串输入流 istringstream
string input("Input test 123 4.7 A");
istringstream inputString(input);
string string1, string2;
int i;
double d;
char c;
inputString >> string1 >> string2 >> i >> d >> c;
cout << string1 << endl << string2 << endl;
cout << i << endl << d << endl << c <<endl;
- 字符串输出流 ostringstream
ostringstream outputString;
int a = 10;
outputString << "This " << a << "ok" << endl;
cout << outputString.str();