1 基本知识
-- string类是模板类
typedef basic_string<char> string;
-- 使用string类要包含头文件<string>
-- string对象的初始化
- string s1("Hello");
- string month = "March";
- string s2(8,' x'); // s2包含8个‘x’
-- 错误的初始化方法
- string error1 = 'c'; // 错误
- string error2('u'); // 错误
- string error3 = 22; // 错误
- string error4(8); // 错误
-- 可以将字符赋值给string对象
- string s;
- s = 'n'; // ok
-- string对象的长度用成员函数length()读取;
string s("hello");
cout << s.length() << endl;
-- string 支持流读取运算符
- string stringObject;
- cin >> stringObject;
-- string 支持getline函数
- string s;
- getline(cin, s);
2 string的赋值和连接
-- 用=赋值
- string s1("cat"), s2;
- s2 = s1;
-- 用assign成员函数复制
- string s1("cat"), s3;
- s3.assign(s1);
-- 用assign成员函数部分复制
- string s1("catpig"), s3;
- s3.assign(s1, 1, 3); // 从s1中下标为1的字符开始复制3个字符
-- 单个字符复制
s2[5] = s1[3] = 'a';
-- 逐个访问string对象中的字符
string s1("Hello");
for(int i = 0; i < s1.length(); i++)
cout << s1.at(i) << endl;
-- 成员函数at会做范围检查,如果查出范围,会抛出out_of_range异常,而下标运算符不会做范围检查
-- 用+运算符连接字符串
string s1("good"), s2(" morning!");
s1 += s2;
cout << s1;
-- 用成员函数append连接字符串
string s1("good"), s2(" morning!");
s1.append(s2);
cout << s1;
s2.append(s1, 3, s1.size()); // s1.size(), s1字符数
cout << s2;
// 下标为3开始,s1.size()个字符,如果字符串内没有足够字符,则复制到字符串最后一个字符。
3 比较string
-- 用关系运算符比较string的大小
- ==, >, >=, <, <=, !=
- 返回值都是bool类型,成立返回true,否则返回false
- 例如:
string s1("hello"), s2("hello"), s3("hell");
bool b = (s1 == s2);
cout << b << endl;
b = (s1 == s3);
cout << b << endl;
b = (s1 > s3);
cout << b << endl;
用成员函数compare比较string的大小
string s1("hello"), s2("hello"), s3("hello");
int f1 = s1.compare(s2); // 输出0 hello == hello
int f2 = s1.compare(s3); // 输出1 hello > hell
int f3 = s3.compare(s1); // 输出-1 hell < hello
// s1下标为1开始的两个字符 和 s3下标为0开始的3个字符
int f4 = s1.compare(1, 2, s3, 0, 3); //s1 1-2; s3 0-3 输出-1 el < hel
int f5 = s1.compare(0, s1.size(), s3); // s1 0-end 输出1 // hello > hel
cout << f1 << endl << f2 << endl << f3 << endl;
cout << f4 << endl << f5 << endl;
4 子串
-- 成员函数substr
string s1("hello world"), s2;
s2 = s1.substr(4, 5); // 下标4开始5个字符
cout << s2 << endl;
5 交换string
-- 成员函数swap
string s1("hello world"), s2("really");
s1.swap(s2);
cout << s1 << endl;
cout << s2 << endl;
6 寻找string中的字符
-- 成员函数find()
- string s1("hello world");
- s1.find("lo");
- 在s1中从前向后查找,“lo”第一次出现的地方,如果找到,返回 “lo”开始的位置,即l所在的位置下标。如果找不到,返回string::npos(string中定义的静态常量)
-- 成员函数rfind()
- string s1("hello world");
- s1.rfind("lo");
- 在s1中从后向前查找,“lo”第一次出现的地方,如果找到,返回“lo”开始的位置,即l所在的位置下标。如果找不到,返回string::npos
-- 成员函数find()
string s1("hello worlld");
cout << s1.find("ll", 1) << endl;
cout << s1.find("ll", 2) << endl;
cout << s1.find("ll", 3) << endl;
// 分别从下标1, 2, 3开始查找“ll” 输出 2 2 9
-- 成员函数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 从前往后查找不在”abcd“中的字母第一次出现的地方
-- 成员函数:find_last_not_of 从后往前查找不在”abcd“中的字母第一次出现的地方
7 删除string中的字符
-- 成员函数erase()
string s1("hello world");
s1.erase(5); // 去掉下标5以及之后的字符
cout << s1;
cout << s1.length();
cout << s1.size();
// 输出 hello55
8 替换string中的字符
-- 成员函数replace()
string s1("hello world");
s1.replace(2, 3, "haha"); // 将s1中下标2开始的3个字符换成”haha“ 输出 hehaha world
s1.replace(2, 3, "haha", 1, 2); // 将s1中下标2开始的3个字符换成”haha“中下标1开始的2个字符 输出 heah world
cout << s1;
9 string中插入字符
-- 成员函数insert()
string s1("hello world");
string s2("show insert");
s1.insert(5, s2); // 将s2插入s1下标5的位置
cout << s1 << endl; // 输出 helloshow insert world
s1.insert(2, s2, 5, 3); // 将s2中下标5开始的3个字符插入s1下标2的位置
cout << s1 << endl; // 输出 heinslloshow insert world
10 转换成C语言式char*字符串
-- 成员函数c_str()
string s1("hello world");
printf("%s\n", s1.c_str());
// s1.c_str()返回传统的const char* 类型字符串,且该字符串以‘\0’结尾
输出: hello world
-- 成员函数data()
string s1("hello world");
const char* p1 = s1.data();
for(int i = 0; i < s1.length(); i++)
printf("%c",*(p1 +i));
// s1.data()返回一个char*类型的字符串,对s1的修改可能会使得p1出错
11 字符串的流处理
-- 除了标准流和文件流输入输出外,还可以从string进行输入输出;
-- 类似istream和ostream进行标准流输入输出,我们用istringstream和ostringstream进行字符串的输入输出,也称为内存输入输出
#include <string>
#include <iostream>
#include <sstream>
-- 字符串输入流
string input("Input test 123");
istringstream inputString(input);
string s1, s2;
int i;
inputString >> s1 >> s2 >> i;
cout << s1 << endl << s2 << endl << i << endl;
long L;
if(inputString >> L) // 由于inputString流中数据已经读取完毕,因此如果你想要再次读取的话,inputString >> L 表达式返回值就是false
cout << "long\n";
else
cout << "empty\n";
输出:
Input
test
123
-- 字符串输出流
ostringstream outputString;
int a = 10;
outputString << "This " << a << "ok" << endl;
cout << outputString.str();
// 输出: This 10ok