在C语言中,字符串是以\0结尾的一串字符的集合,而为了操作方便,C标准库中提供了一些str系列的库函数,比如,strcpy、strlen、strcmp等等。但是这些库函数与字符串是分离开的,不太符合OOP的思想(面向对象编程(Object Oriented Programming)),而且底层空间需要用户自己管理,稍不留神可能就会有越界访问的问题发生。
string容器是c++中表示字符序列的一个类,同时也是一个类模板。它提供了许多成员函数和运算符重载,封装了C++中对字符串的常见操作和功能,提供了更高级的字符串处理能力,并且隐藏了底层的实现细节,使得字符串的操作更加方便和安全。但string类是一个泛型类,它是由模板实例化出来的一个标准类,本质上不是一个标准数据类型。详情参见上方string容器文档。
常用构造函数名称 | 功能说明 |
---|---|
string() | 创建一个空的string类对象,即空字符串 |
string(const char* s) | 用C语言格式的字符串来构造string类对象 |
string(size_t n, char c) | 创建一个包含n个字符c的string类对象 |
string(const string& str) | string类的拷贝构造函数,用对象str创建一个string类对象 |
#include
#include
using namespace std;
void Test_string1()
{
string s1;
cout << s1 << endl;
string s2("snow dragon");
cout << s2 << endl;
string s3(6, 's');
cout << s3 << endl;
string s4(s2);
cout << s4 << endl;
}
int main()
{
try
{
Test_string1();
}
catch (const std::exception& e)
{
cout << e.what() << endl;
}
return 0;
}
=运算符用一个新值为string对象的字符串赋值,它会替换掉string对象字符串之前的内容。
int main()
{
string s1;
string s2 = "snow dragon"; // 调用构造函数 + 拷贝构造 -> 编译器优化 --> 直接调用构造函数创建对象s2
cout << s1 << endl;
cout << s2 << endl;
s1 = s2;
cout << s1 << endl;
s1 = "ssss";
cout << s1 << endl;
s1 = 's';
cout << s1 << endl;
return 0;
}
函数名称 | 功能说明 |
---|---|
size_t size() const; | 返回字符串的长度(以字节为单位)。 |
size_t capacity() const; | 返回当前为字符串分配的存储空间的大小,以字节表示。 |
bool empty() const; | 返回字符串是否为空,即其长度是否为 0。 |
void clear(); | 擦除字符串的内容,该字符串将成为空字符串(长度为 0 个字符)。 |
void reserve (size_t n = 0); | 请求更改容量的大小,对字符串(对象)长度没有影响,并且无法更改其内容。 |
void resize (size_t n);void resize (size_t n, char c); | 将字符串的大小调整为n个字符的长度,即修改size。 |
void Test_string2()
{
string s1("snow");
cout << s1 << endl;
cout << s1.size() << endl;
cout << s1.capacity() << endl;
cout << s1.empty() << endl;
cout << "***************************" << endl;
string s2;
cout << s2.empty() << endl;
cout << "***************************" << endl;
string s3("snow");
cout << s3 << endl;
cout << s3.size() << endl;
s3.resize(10, '!');
cout << s3 << endl;
cout << s3.size() << endl;
s3.resize(3);
cout << s3 << endl;
cout << s3.size() << endl;
cout << "***************************" << endl;
string s4;
s4.reserve(100);
cout << s4.size() << endl;
cout << s4.capacity() << endl;
s4.reserve(50);
cout << s4.size() << endl;
cout << s4.capacity() << endl;
cout << "***************************" << endl;
s1.clear();
cout << s1 << endl;
cout << s1.size() << endl;
cout << s1.capacity() << endl;
}
返回string对象字符串下标为pos的字符的引用。
void Test2()
{
string s1("snow dragon");
cout << s1[0] << endl;
cout << s1 << endl;
s1[0] = 'h';
cout << s1[0] << endl;
cout << s1 << endl;
//遍历string对象并对它的每个字符+1
for (size_t i = 0; i < s1.size(); ++i)
{
s1[i]++;
}
cout << s1 << endl;
const string s2("dragon");
for (size_t i = 0; i < s2.size(); ++i)
{
//s2[i]++;
cout << s2[i] << " ";
}
cout << endl;
cout << s2 << endl;
//cout << s2[10] << endl; //编译器内部会检查是否越界
}
迭代器是一种检查容器内的元素并遍历元素的数据类型,通常用于对C++中各种容器内的元素进行访问。
void Test3()
{
cout << "s1 test" << endl;
string s1("snow");
cout << s1 << endl;
string::iterator it1 = s1.begin();
while (it1 != s1.end())
{
(*it1)++;
cout << *it1 << " ";
++it1;
}
cout << endl;
//范围for: 自动迭代,自动判断结束。底层其实就是迭代器
//下方为使用范围for依次取s1中的每个字符并赋值给ch,再将ch自增1,最后输出
for (auto& ch : s1)
{
ch++;
cout << ch << " ";
}
cout << endl;
cout << s1 << endl;
cout << "s2 test" << endl;
string s2("snow dragon");
cout << s2 << endl;
string::reverse_iterator rit2 = s2.rbegin();
while (rit2 != s2.rend())
{
cout << *rit2 << " ";
++rit2;
}
cout << endl;
cout << "s3 test" << endl;
const string& s3("snow dragon");
cout << s3 << endl;
//string::const_iterator it3 = s3.begin();
auto it3 = s3.begin();
while (it3 != s3.end())
{
//*it3 = 'x';
cout << *it3 << " ";
++it3;
}
cout << endl;
cout << "s3 reverse iterator test" << endl;
//auto rit3 = s3.rbegin();
string::const_reverse_iterator rit3 = s3.rbegin();
while (rit3 != s3.rend())
{
cout << *rit3 << " ";
++rit3;
}
cout << endl;
}
void Test4()
{
string s("snow");
s.push_back('-');
s.push_back('-');
s.append("dragon");
cout << s << endl;
string str("coming");
s += '@';
s += str;
s += "!!!";
cout << s << endl;
s.append(++str.begin(), --str.end());
cout << s << endl;
string copy1(++s.begin(), --s.end());
cout << copy1 << endl;
string copy2(s.begin() + 5, s.end() - 5);
cout << copy2 << endl;
}
c_str将调用它的string对象字符串转换为一个字符数组,该数组是以\0结尾的,最后返回指向这个数组的指针。
void Test5()
{
string name("snow");
cout << name << endl;
cout << name.c_str() << endl;
name += '\0';
name += "dragon";
cout << name << endl;
cout << name.c_str() << endl;
cout << name.size() << endl;
string copy = name;
cout << copy << endl;
cout << '\0' << endl;
cout << "end" << endl;
}
void DealUrl(const string& url)
{
size_t pos1 = url.find("://");
if (pos1 == string::npos)
{
cout << "非法url" << endl;
return;
}
string protocol = url.substr(0, pos1);
cout << protocol << endl;
size_t pos2 = url.find('/', pos1 + 3);
if (pos2 == string::npos)
{
cout << "非法url" << endl;
return;
}
string domain = url.substr(pos1 + 3, pos2 - pos1 - 3);
cout << domain << endl;
string uri = url.substr(pos2 + 1);
cout << uri << endl;
}
void Test6()
{
string name("snow.dragon.happy.everyday");
//输出前缀
size_t pos = name.find('.');
if (pos != string::npos)
{
string suff = name.substr(0, pos);
cout << suff << endl;
}
//输出后缀
pos = name.rfind('.');
if (pos != string::npos)
{
string suff = name.substr(pos);
cout << suff << endl;
}
string url1 = "https://legacy.cplusplus.com/reference/string/string/find/";
cout << url1 << endl;
DealUrl(url1);
}
本文到这里就结束了,如有错误或者不清楚的地方欢迎评论或者私信
创作不易,如果觉得博主写得不错,请务必点赞、收藏加关注