- C++
通俗易懂的 C++ 中 string 教程
- 2024-12-7 21:39:32 @
以下是一份通俗易懂的C++中 string
教程,在代码示例中尽量不使用 std::
前缀(不过要记得在实际编写代码时,如果没有 using namespace std;
声明,还是需要加上 std::
的哦,这里只是为了方便讲解让示例更简洁):
1. 认识 string
在C++里,string
是一种专门用来处理字符串的类型,它就像是一个能装字符的容器,比起传统的C语言风格的字符数组(比如 char
数组),用 string
来操作字符串方便多了,不用再担心像字符数组那样容易出现的越界、内存管理麻烦等问题啦。
2. 包含头文件
要使用 string
,得先在代码最开头把对应的头文件包含进来,就像这样写:
#include <string>
3. 定义 string
对象
- 定义空字符串:
可以简单地创建一个空的
string
对象,如下所示:
string myString;
这时候 myString
里面还没有装任何字符呢,就是个空的字符串容器哦。
- 初始化定义字符串: 也可以在定义的时候就给它赋上初始值,比如:
string anotherString = "Hello, World!";
这样 anotherString
这个 string
对象一开始就包含了 "Hello, World!"
这么一串字符啦。
4. 获取字符串长度
想知道一个 string
对象里装了多少个字符,可以用 length
或者 size
函数来获取,它们的作用是一样的哦,看下面的例子:
string text = "C++ is great";
int len1 = text.length();
int len2 = text.size();
// 这里len1和len2的值是相等的,都会得到13,因为这个字符串里总共有13个字符哦
5. 访问字符串里的字符
- 通过下标访问:
就跟访问数组里的元素差不多,咱们可以用下标去访问
string
里的每个字符哦,不过下标是从0开始计数的哟,像这样:
string str = "abc";
char firstChar = str[0]; // 这里firstChar拿到的就是字符'a'啦
char secondChar = str[1]; // 那secondChar拿到的就是字符'b'咯
但是要小心哦,如果用的下标超出了字符串长度范围(比0小或者大于等于字符串的长度了),那程序可就可能出问题啦,出现一些不可预测的行为呢。
- 用迭代器访问(稍微高级一点的方法哦):
迭代器可以理解成是一种指向
string
里字符的特殊“指针”,通过它也能逐个访问字符串里的字符哦,看下面的代码示例:
string message = "Hello";
string::iterator it;
for (it = message.begin(); it!= message.end(); ++it) {
cout << *it; // 每次循环的时候,通过解引用迭代器*it就能输出一个字符哦,这样就能把整个字符串输出啦
}
// 最后输出的就是"Hello"这个字符串本身咯
6. 拼接字符串
- 用
+
运算符拼接: 可以使用+
运算符把两个string
对象或者一个string
对象和一个C风格的字符数组(也就是用char
数组表示的字符串啦)拼接到一起哦,像下面这样:
string part1 = "Good ";
string part2 = "Morning";
string combined = part1 + part2;
// 这时候combined这个string对象里的内容就是"Good Morning"啦,把两个部分拼接起来了哦
string greeting = "Hello";
char name[] = "Alice";
string fullGreeting = greeting + name;
// 那fullGreeting里的内容就变成"HelloAlice"了哦,把string和字符数组也拼接上了呢
- 用
append
函数拼接: 还有个append
函数也能用来在一个string
对象的末尾添加别的字符串内容哦,示例如下:
string base = "I like ";
string addition = "programming";
base.append(addition);
// 这么操作之后,base这个string对象里的内容就变成"I like programming"了呀,把addition的内容添加到base的末尾了哦
7. 比较字符串
- 用比较运算符比较(像
==
、!=
、<
、>
这些哦): 直接用这些比较运算符就能比较两个string
对象啦,比较的时候是按照字典序来的哦,也就是按照字符的ASCII码值顺序来判断谁大谁小呢,看下面的代码:
string str1 = "apple";
string str2 = "banana";
if (str1 < str2) {
cout << "apple comes before banana";
}
- 用
compare
函数比较(功能更丰富一点哦):compare
函数可以提供更详细的比较情况呢,它会返回一个整数值,根据返回值就能知道比较的结果啦。要是返回值小于0,就表示当前这个string
对象比拿来比较的那个string
对象要小(按字典序哦);要是返回值等于0,那就说明两个字符串是相等的;要是返回值大于0,那就是当前的string
对象更大咯,像下面这样:
string s1 = "abc";
string s2 = "def";
int result = s1.compare(s2);
// 这里result的值会小于0哦,因为"abc"按照字典序是排在"def"前面的呀
8. 查找字符串里的内容
- 用
find
函数查找: 想在一个string
对象里找另一个子字符串或者某个特定的字符,就可以用find
函数哦,看下面的例子:
string text = "I love C++ programming";
int position = text.find("C++");
// 这里position的值会是7哦,因为子字符串"C++"在原字符串里的起始位置(下标从0开始算嘛)就是7呀
要是没找到要找的内容呢,find
函数就会返回一个特殊的值,叫 string::npos
,它就代表着没找到的意思哦。
9. 替换字符串里的内容
- 用
replace
函数替换: 要是想把string
对象里的某部分内容给换掉,就可以用replace
函数啦,示例如下:
string sentence = "I like coffee";
sentence.replace(7, 6, "tea");
// 这么操作之后,sentence这个string对象里的内容就变成"I like tea"了哦,从下标7开始的6个字符(也就是"coffee"这部分)就被替换成"tea"了呀
10. 分割字符串(稍微复杂一点的操作哦)
有时候咱们可能想把一个字符串按照某个特定的符号或者规则分成好几段,这时候可以借助 stringstream
这个类来帮忙(不过得先把 <sstream>
头文件包含进来哦),看下面的例子:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main() {
string input = "apple,banana,cherry";
stringstream ss(input);
string token;
vector<string> fruits;
while (getline(ss, token, ',')) {
fruits.push_back(token);
}
// 经过这么一番操作呀,fruits这个vector容器里就装了三个字符串啦,分别是"apple"、"banana"、"cherry"哦
return 0;
}
11. 一些小提示和注意事项
string
类型会自己管理好内存哦,当字符串里的字符变多或者变少的时候,它会自动去分配或者释放合适的内存空间,不用咱们手动去操心这些事儿啦。- 不过要是处理特别长的字符串,或者要频繁地做各种字符串操作的时候,可得留意一下性能方面的问题哦。比如说频繁地拼接字符串,可能会导致内存频繁重新分配和数据复制,这时候也许可以考虑用
stringstream
或者别的更高效的办法来处理字符串呢。
希望这份教程能让你轻轻松松地理解和掌握C++里 string
的用法呀!要是还有啥不明白的地方,可以随时问我哦。