我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第21篇文章,点击查看活动详情
在 C++ 中,我们可以通过以下两种方式之一来存储字符串——
- C风格的字符串
- 字符串类(在这篇文章中讨论)
在这篇文章中,讨论了第二种方法。string 类是 C++ 库的一部分,它支持 C 样式字符串的许多功能。
C++ 字符串类内部使用 char 数组来存储字符,但所有内存管理、分配和空终止都由字符串类本身处理,这就是它易于使用的原因。由于类似于向量的动态内存分配,C++ 字符串的长度可以在运行时更改。由于 string 类是一个容器类,我们可以使用类似于 vector、set 和 maps 等其他容器的迭代器来迭代它的所有字符,但通常,我们使用一个简单的 for 循环来迭代字符并使用 [] 索引它们操作员。
C++ 字符串类有很多函数可以轻松处理字符串。其中最有用的在下面的代码中演示。
// C++程序演示各种函数字符串类
#include <bits/stdc++.h>
using namespace std;
int main()
{
// 通过原始字符串初始化字符串类的各种构造函数
string str1("first string");
// 由另一个字符串初始化
string str2(str1);
// 按出现次数按字符初始化
string str3(5, '#');
// 由另一个字符串的一部分初始化
string str4(str1, 6, 6); // from 6th index (second parameter)
// 6 characters (third parameter)
// 由另一个字符串的一部分初始化:迭代器版本
string str5(str2.begin(), str2.begin() + 5);
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
cout << str4 << endl;
cout << str5 << endl;
// 赋值运算符
string str6 = str4;
// clear 函数从字符串中删除所有字符
str4.clear();
// size() 和 length() 都返回字符串的长度,它们作为同义词工作
int len = str6.length(); // Same as "len = str6.size();"
cout << "Length of string is : " << len << endl;
// 可以使用 at / [] 运算符访问特定字符
char ch = str6.at(2); // Same as "ch = str6[2];"
cout << "third character of string is : " << ch << endl;
// 前面返回第一个字符,后面返回字符串的最后一个字符
char ch_f = str6.front(); // 与“ch_f = str6[0];”相同
char ch_b = str6.back(); // 和下面一样
// "ch_b = str6[str6.length() - 1];"
cout << "First char is : " << ch_f << ", Last char is : "
<< ch_b << endl;
// c_str 返回字符串的空终止字符数组版本
const char* charstr = str6.c_str();
printf("%s\n", charstr);
// append 在末尾添加参数字符串
str6.append(" extension");
// same as str6 += " extension"
// 另一个版本的附加,它附加了其他字符串的一部分
str4.append(str6, 0, 6); // at 0th position 6 character
cout << str6 << endl;
cout << str4 << endl;
// find 返回找到模式的索引。 如果模式不存在,则返回值为 -1 的预定义常量 npos
if (str6.find(str4) != string::npos)
cout << "str4 found in str6 at " << str6.find(str4)
<< " pos" << endl;
else
cout << "str4 not found in str6" << endl;
// substr(a, b) 函数返回从索引 a 开始的长度为 b 的子字符串
cout << str6.substr(7, 3) << endl;
// 如果没有传递第二个参数,则字符串直到结束被视为子字符串
cout << str6.substr(7) << endl;
// erase(a, b) 删除索引 a 处的 b 个字符
str6.erase(7, 4);
cout << str6 << endl;
// 擦除的迭代器版本
str6.erase(str6.begin() + 5, str6.end() - 3);
cout << str6 << endl;
str6 = "This is a examples";
// replace(a, b, str) 用 str 替换索引中的 b 个字符
str6.replace(2, 7, "ese are test");
cout << str6 << endl;
return 0;
}
输出 :
first string
first string
#####
string
first
Length of string is : 6
third character of string is : r
First char is : s, Last char is : g
string
string extension
string
str4 found in str6 at 0 pos
ext
extension
string nsion
strinion
These are test examples
从上面的代码中可以看出,我们可以通过 size() 和 length() 来获取字符串的长度,但 length() 是字符串的首选。我们可以通过 += 或 append() 将一个字符串连接到另一个字符串,但是 += 比 append() 稍微慢一些,因为每次调用 + 时都会生成一个新字符串(创建新缓冲区),它会返回一个在许多附加操作的情况下的位开销。
\
应用程序:
基于上述字符串函数,一些应用程序编写如下:
// C++ 程序来演示一些字符串函数的使用
#include <bits/stdc++.h>
using namespace std;
// 此函数返回数字字符串的浮点部分
string returnFloatingPart(string str)
{
int pos = str.find(".");
if (pos == string::npos)
return "";
else
return str.substr(pos + 1);
}
// 此函数检查字符串是否包含所有数字
bool containsOnlyDigit(string str)
{
int l = str.length();
for (int i = 0; i < l; i++)
{
if (str.at(i) < '0' || str.at(i) > '9')
return false;
}
// 如果我们到达这里所有字符都是数字
return true;
}
// 此函数将所有单个空格替换为 %20 在 URLS 中使用
string replaceBlankWith20(string str)
{
string replaceby = "%20";
int n = 0;
// 循环直到所有空间都被替换
while ((n = str.find(" ", n)) != string::npos )
{
str.replace(n, 1, replaceby);
n += replaceby.length();
}
return str;
}
// 用于检查上述方法的驱动程序功能
int main()
{
string fnum = "23.342";
cout << "Floating part is : " << returnFloatingPart(fnum)
<< endl;
string num = "3452";
if (containsOnlyDigit(num))
cout << "string contains only digit" << endl;
string urlex = "google com in";
cout << replaceBlankWith20(urlex) << endl;
return 0;
}
输出 :
Floating part is : 342
string contains only digit
google%20com%20in