- (꒪ꇴ꒪ ),Hello我是祐言QAQ
- 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍
- 快上🚘,一起学习,让我们成为一个强大的攻城狮!
- 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
- 作者水平很有限,如果发现错误,请在评论区指正,感谢🙏
在C++中,字符串处理是非常重要的一部分,而string
类是STL中封装的一个重要工具,用于处理字符串。它的强大功能在上上篇博客中有些许讲解,那么本文将介绍C++中字符串的基本概念以及string
类的构造方法,让你彻底理解和掌握C++中的string类。
一. C++中字符串的概念
在C++中,字符串是文本数据的重要形式,用于存储和处理文本信息。C++中,有多种方式来表示字符串,其中最常用的是使用string
类。掌握好string类对新手是及其重要的。
1.1 string
类
string
是C++标准模板库(STL)中封装的一个类,用于表示和操作字符串。它是对字符数组(char
数组)或字符指针(char *
)的封装,提供了一系列的成员函数(后文马上也会介绍到详细的常见成员用法等),简化了字符串的操作。
1.2 string
类的优势
与传统的字符数组或字符指针相比,string
类有以下优势:
-
内存管理:
string
类会自动管理字符串的内存,不需要手动释放内存或担心内存越界问题。 -
操作简便:
string
类提供了丰富的成员函数,使得字符串的操作变得更加简单和灵活。 -
安全性:由于内存管理由
string
类自动处理,可以减少许多常见的内存错误。
1.3 输入字符串
需要注意的是,如果使用 cin
来输入字符串,它会在遇到空格时停止输入。如果需要获取包含空格的输入,应使用getline
函数,如下所示:
string name;
getline(cin, name); // 通过getline获取包含空格的输入
getline函数的具体用法呢上一篇博客中也有详细介绍,感兴趣请翻阅查看。
二. string
字符串的构造
现在让我们来看一下如何构造string
字符串。
2.1 默认无参构造函数
string
类具有默认无参构造函数,可以用来创建一个空的字符串对象,如下所示:
string str; // 创建一个空的字符串对象
2.2 有参构造函数
string
类也提供了有参构造函数,用于根据给定的内容创建字符串对象。以下是一些示例:
- 使用字符串字面值创建字符串对象:
string str1("hello world"); // 使用字符串字面值创建字符串对象
string str2 = "hello world"; // 另一种方式
- 使用字符和重复次数创建字符串对象:
string str3(10, 'A'); // 创建包含10个'A'字符的字符串
2.3 拷贝构造函数
string
类还具有拷贝构造函数,可以通过复制已有的字符串对象来创建新的字符串对象,如下所示:
string str4 = str1; // 使用拷贝构造函数创建新的字符串对象
string str5(str2); // 另一种使用拷贝构造函数的方式
三. 重载运算符
学习C语言时大家肯定对重载没有太多印象,如果你能记起 & 是被重载的那么你的C语言是扎实的,它既可以是按位与操作符又是取地址操作符;那么在C++中,string
类重载了许多操作符,使得字符串的操作更加方便和灵活。下面我们将介绍一些常见的操作符重载函数。
3.1 赋值运算符(=)
赋值运算符(=
)被重载用于将一个字符串赋值给另一个字符串。例如:
string str1 = "hello world"; // 使用赋值运算符将一个字符串赋值给str1
string str2;
str6 = str1; // 使用赋值运算符将str4的值赋给str2
cout << "str2 = " << str2 << endl;
3.2 左移运算符(<<)
左移运算符(<<
)被重载用于将字符串输出到输出流,通常用于输出到控制台。例如:
string str1 = "hello world";
cout << "str1 = " << str1 << endl; // 使用左移运算符将str1输出到控制台
3.3 右移运算符(>>)
右移运算符(>>
)被重载用于从输入流中读取字符串。例如:
string str1;
cin >> str1; // 使用右移运算符从输入流中读取字符串
3.4 数组下标操作符([])
数组下标操作符([]
)被重载,使得可以通过下标访问字符串中的字符。例如:
string str1 = "hello world";
char c = str1[2]; // 使用数组下标操作符访问字符串的第三个字符(下标从0开始)
cout << "c = " << c << endl; // 输出 c = l
3.5 加法运算符(+)
加法运算符(+
)被重载用于将两个字符串连接起来。例如:
string str1 = "hello ";
string str2 = "world";
string str3;
str3 = str1 + str2; // 使用加法运算符连接两个字符串
3.6 加法赋值运算符(+=)
加法赋值运算符(+=
)被重载用于将一个字符串与另一个字符串连接并将结果赋值给原字符串。例如:
string str1 = "hello ";
string str2 = "world";
str1 += str2; // 使用加法赋值运算符连接并赋值
3.7 关系运算符(==、!=、<、>、<=、>=)
关系运算符(==
、!=
、<
、>
、<=
、>=
)被重载,用于比较两个字符串的大小关系。例如:
string str1 = "apple";
string str2 = "banana";
if (str1 < str2) {
cout << "str1 小于 str2" << endl;
} else {
cout << "str1 大于等于 str2" << endl;
}
注意:
只要你的类(stig字符串)里面,只要对运算符有做重载,你都可以直接去用这个运算符,如果没有,则会报以下这个错误:
no match for‘operator|’ //operator是关键,表示后面的这个运算符没有做重载
四、C++的string成员函数
之前的一篇博客已经详细的讲解了string
类强大的功能,那么今天我们来看看该类下到底有多少常用的成员函数,用于操作和处理字符串。
4.1 length()
或size()
返回字符串的长度,即字符的个数。
string str = "hello";
int len = str.length();
// 或 int len = str.size();
4.2 empty()
检查字符串是否为空,返回true
表示为空,false
表示非空。
string str = "hello";
bool isEmpty = str.empty(); // 返回 false
4.3 clear()
清空字符串的内容,使其成为空字符串。
string str = "hello";
str.clear(); // str现在是一个空字符串
4.4
substr(start, length)
返回从指定位置开始的指定长度的子字符串。
string str = "hello world";
string sub = str.substr(6, 5); // sub = "world"
4.5 find(substring)
在字符串中查找子字符串,并返回第一次出现的位置(索引),如果未找到则返回string::npos
。
string str = "hello world";
size_t pos = str.find("world"); // pos = 6
4.6 replace(start, length, new_str)
用新字符串替换指定位置的子字符串。
string str = "hello world";
str.replace(6, 5, "there"); // str = "hello there"
4.7 append(new_str)
或+=
将新字符串追加到原字符串的末尾。
string str = "hello";
str.append(" world"); // str = "hello world"
// 或者
string str1 = "hello";
string str2 = " world";
str1 += str2; // str1 = "hello world"
4.8 insert(pos, new_str)
在指定位置插入新字符串。
string str = "hello";
str.insert(3, " there"); // str = "hello there"
4.9 erase(start, length)
删除指定位置的一段字符。
string str = "hello world";
str.erase(6, 5); // str = "hello "
4.10 compare(str2)
与另一个字符串比较,返回0表示相等,正数表示大于,负数表示小于。
string str1 = "apple";
string str2 = "banana";
int result = str1.compare(str2); // result < 0,因为"apple"小于"banana"
4.11 at()
获取字符串的单个字符。
string str1("hello");
string str2("world");
char c=str1.at(4); //获取下标为4的这个字符
cout <"c ="<c <endl;
str2.at(0)='h'; //更改第0个字符为'h'
cout <"str2 ="<str2 <endl;
4.12 assign()
字符串的赋值。
string str1("hello world");
string str2;
str2.assign(str1);
cout <"str2 ="<str2 <endl;
string str3;
str3.assign(str1,0,5); //从0开始,赋值5个
cout <"str3 ="<str3 <endl;
4.13 swap()
字符串的交换。
string str1("hello");
string str2("world");
cout <"str1 ="<str1 <endl;
cout <"str2 ="<str2 <endl;
str1.swap(str2);
cout <"str1 ="<str1 <endl;
cout <"str2 ="<str2 <endl;
练习1:将字符串中所有的小写字母和大写字母颠倒并输出。
#include <iostream>
using namespace std;
int main() {
string str("Hello WorLD");
// 遍历字符串中的每个字符
for (int i = 0; i < str.length(); ++i) {
// 如果字符是大写字母,将其转换为小写字母
if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] += 32;
}
// 如果字符是小写字母,将其转换为大写字母
else if (str[i] >= 'a' && str[i] <= 'z') {
str[i] -= 32;
}
}
cout << str << endl;
return 0;
}
练习2:编写一个程序,去掉给定字符串中重复的字符,比如goooooogle => gole。
#include <iostream>
using namespace std;
int main() {
string str;
cin >> str; // 从输入获取字符串,例如输入:gooooogle
// 遍历字符串中的每个字符
for (int i = 0; i < str.length(); ++i) {
// 再次遍历字符串中的字符,从当前字符的下一个位置开始
for (int j = i + 1; j < str.length(); ) {
// 如果当前字符与后面的字符相同,就删除后面的字符
if (str[i] == str[j]) {
str.erase(j, 1); // 删除重复字符(假设删除字符的后一个还是这个字符)
} else {
++j;
}
}
}
cout << str << endl; // 输出移除重复字符后的字符串
return 0;
}
更多C/C++语言、Linux系统、数据结构和ARM板实战相关文章,关注专栏:
手撕C语言
玩转linux
脚踢数据结构
系统、网络编程
探索C++
6818(ARM)开发板实战
📢写在最后
- 今天的分享就到这啦~
- 觉得博主写的还不错的烦劳
一键三连喔
~ - 🎉🎉🎉感谢关注🎉🎉🎉