C++基础(21)C++字符串类及其应用

643 阅读2分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第21篇文章,点击查看活动详情

在 C++ 中,我们可以通过以下两种方式之一来存储字符串——

  1. C风格的字符串
  2. 字符串类(在这篇文章中讨论)

在这篇文章中,讨论了第二种方法。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