1. 概述
在C++中,字符串的处理一直是程序员们十分头疼的问题,早期的C++中只有字符指针和字符数组可以用来处理字符串,但是这样的处理方式不够方便且容易出错。引入
2. string的基本用法
2.1 string定义
C++中的string定义格式如下所示:
#include
using std::string;
string str = "hello world";
这里的string是一个类,所以需要用类似point和vector等的头文件引用方式来引用和使用它。
2.2 string基本操作
下面对常用的基本操作进行简要介绍:
2.2.1 string赋值
1.使用等于号进行字符串之间的赋值,也可以将字符串直接赋值给string变量:
string str1 = "hello,world";
string str2 = "Hello,World";
str2 = str1;
string str3 = "Hello";
string str4 = str3;
2.使用assign()函数进行字符串赋值,还可以指定起始位置和长度:
string str1 = "hello world";
string str2;
str2.assign(str1);
2.2.2 string比较
1.使用比较运算符进行字符串大小的比较:
string str1 = "hello";
string str2 = "world";
if (str1 > str2)
cout << str1 << endl;
else
cout << str2 << endl;
2.使用compare()函数进行字符串大小的比较,返回值为整型,如下:
string str1 = "hello";
string str2 = "world";
if (str1.compare(str2) == 1)
cout << str1 << endl;
else
cout << str2 << endl;
2.2.3 string从字符串中获取子串
使用substr函数获取指定位置和长度的子串:
string str = "hello world";
string substr = str.substr(0, 5);
cout << substr << endl;
//输出结果为:hello
2.2.4 string查找
1.使用find()函数进行查找,找到返回匹配字符串起始位置,找不到则返回string::npos
string str = "hello world";
string substr = "world";
int pos = str.find(substr);
if (pos != string::npos)
cout << pos << endl;
2.使用rfind()函数进行反向查找,找到返回匹配字符串起始位置,找不到则返回string::npos
string str = "hello world";
string substr = "l";
int pos = str.rfind(substr);
if (pos != string::npos)
cout << pos << endl;
2.2.5 string替换
使用replace()函数进行字符串替换。第一个参数指定替换的起始位置,第二个参数指定替换的长度,第三个参数指定替换的字符串
string str = "hello world";
str.replace(0, 5, "hi");
cout << str << endl;
//输出结果为:hi world
3. string实战应用
3.1 文件读取
下面的示例展示了如何使用string读取文件:
#include
#include
#include
using namespace std;
int main()
{
ifstream fin("input.txt");
if (!fin)
cout << "文件打开失败" << endl;
string str;
while (getline(fin, str))
{
cout << str << endl;
}
fin.close();
return 0;
}
这里使用了getline()函数,它会读取一整行文本,并存储到一个string变量中,如果读取到文件结尾,则返回false。
3.2 字符串分割
下面的示例展示了如何使用string进行字符串分割:
#include
#include
using namespace std;
int main()
{
string str = "hello,world";
string delimiter = ",";
size_t pos = 0;
string token;
while ((pos = str.find(delimiter)) != string::npos)
{
token = str.substr(0, pos);
cout << token << endl;
str.erase(0, pos + delimiter.length());
}
cout << str << endl;
return 0;
}
这里使用了find()函数查找分隔符的位置,如果找到分隔符,则使用substr()函数获取分割后的子串,并输出。然后使用erase()函数将已经输出的部分从字符串中删除。
3.3 正则表达式匹配
C++中提供了
#include
#include
#include
using namespace std;
int main()
{
string str = "my email address is anon@anon.com";
regex pattern("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+");
smatch result;
if (regex_search(str, result, pattern))
{
cout << result[0] << endl;
}
return 0;
}
这里使用了regex_search()函数进行正则表达式的匹配,结果存储在smatch类型的result中。如上所示,正则表达式可以用来匹配各种各样的字符串模式。
4. 总结
使用string标准库可以方便地处理字符串,大大提高了程序员的编程效率。C++中string类提供了丰富的接口,如赋值,比较,子串获取,字符串替换等等,可以满足绝大部分字符串处理的需求。这里展示的实际应用中,string可以用作文件读取,字符串分割,正则表达式等等,使其成为C++中不可或缺的一个标准库。