C++ 字符串

2025 年 8 月 29 日 | 阅读 13 分钟

在 C++ 中,字符串是 std::string 类的对象,代表一个字符序列。我们可以对字符串执行许多操作,例如连接、比较、转换等。

C++ 将字符串作为字符的顺序集合来处理文本数据的存储和操作。字符串的主要编程功能使开发人员能够有效地处理姓名、消息、句子和其他文本数据。字符串为了存储其字符而占据一个连续的内存块,但它们与 int 或 char 等单值 数据类型 有根本区别。

简单的字符串示例

让我们看一个简单的 C++ 字符串示例。

示例

编译并运行

输出

Hello
C++

说明

此 C++ 程序演示了字符串初始化,其中 s1 被赋值为字符串字面量,s2 通过字符串构造函数从字符数组创建。之后,它将这两个字符串作为输出打印。

C++ 中的字符串类型

C++ 支持两种主要的字符串类型

1. C 风格字符串(字符数组)

C 风格字符串包含以终止空字符 (\0) 停止的顺序字符。使用此字符串类型需要 <cstring> 库的 内存处理 函数以及用户控制的内存管理。

示例

2. C++ 字符串(标准库中的 std::string)

通过 std::string 处理的字符串比标准模板库 (STL) 具有更好的灵活性和安全性。内置函数 length()、append()、substr() 和 replace 帮助用户标准地有效地操作字符串。标准库字符串自动管理内存,因此开发人员避免遇到缓冲区溢出。

示例

在 C++ 中创建和初始化字符串

在 C++ 中,可以使用 C 风格字符 数组 或 <string> 库中的 std::string 来创建和初始化字符串。

a. 初始化 C 风格字符串

b. 初始化 std::string

示例

让我们看一个例子来说明在 C++ 中创建和初始化字符串。

示例

编译并运行

输出

C-Style Strings:
str1: Hello
str2: Hello
str3: Hello

std::string Initialization:
s1: Hello
s2: World
s3: AAAAA
s4: Hello World

说明

该程序演示了使用字符数组初始化 C 风格字符串以及使用直接赋值、构造函数和连接初始化 std::string 的不同方法。它打印初始化后的值以显示它们在 C++ 字符串处理中的用法。

在 C++ 中访问字符串

可以通过字符串中的索引按位置访问字符串元素。C 风格字符串通过数组表示法访问元素,而 std::string 为用户提供了多种检索字符的函数。循环中的遍历方法使用户能够操作或检索字符串中的信息。

a) 访问 C 风格字符串

使用数组索引

我们可以在 C++ 中使用数组索引来访问 C 风格字符串。

使用指针

我们可以在 C++ 中使用指针来访问 C 风格字符串。

b) 访问 std::string

使用 [] 运算符

我们可以在 C++ 中使用 [] 运算符来访问 std::string。

使用 .at(index)

我们也可以在 C++ 中使用 .at(index) 来访问 std::string。

使用 .front() 和 .back()

我们也可以在 C++ 中使用 .front() 和 .back() 函数来访问 std::string。

示例

让我们看一个例子来说明在 C++ 中访问字符串。

示例

编译并运行

输出

C-Style String Access:
Using array indexing: H
Using pointer: H
Using pointer arithmetic: e
Using loop traversal: Hello

std::string Access:
Using [] operator: e
Using .at(): l
Using .front(): H
Using .back(): o
Using iterators: Hello
Using range-based for loop: Hello
Using .c_str(): Hello

说明

此 C++ 程序演示了使用索引、指针和 循环 访问 C 风格字符串的各种方法,以及使用 .at()、.front()、.back()、迭代器和范围基于循环等方法访问 std::string。它还使用 .c_str() 将 std::string 转换为 C 风格字符串。

在 C++ 中更新字符串

可以通过更改特定字符以及添加新部分或替换现有文本来修改字符串。C 风格字符串在修改期间需要适当的内存管理,因为可能会发生缓冲区溢出,而 std::string 包含自动函数来添加、插入、删除和交换其字符串中的部分。

a) 更新 C 风格字符串

使用 [] 运算符

在 C++ 中,我们可以使用 [] 运算符更新 C 风格字符串。

b) 更新 std::string

使用 [] 或 .at()

在 C++ 中,我们可以使用 [] 运算符更新 C 风格字符串。

示例

让我们看一个例子来说明如何在 C++ 中更新字符串。

示例

编译并运行

输出

Updated C-Style String: Mello
After modifying using []: Mello
After modifying using at(): Mallo

说明

此 C++ 程序演示了在 C++ 中更新 C 风格字符串和 std::string。它使用索引 ('[]') 和 '.at()' 方法修改特定字符,展示了如何安全地更改字符串值。

使用 .append() 或 += 追加字符串

字符串允许通过 C 风格的手动连接或 std::string 的内置操作将新字符或单词追加到其末尾。

使用 .append() 方法

我们可以在 C++ 中使用 .append() 方法追加字符串。

使用 += 运算符

我们可以在 C++ 中使用 += 运算符追加字符串。

示例

让我们看一个例子来说明如何在 C++ 中追加字符串。

示例

编译并运行

输出

After append(): Hello World
After += operator: Hello World!!!

说明

'.append()' 方法将 " World" 添加到原始字符串 "Hello" 中,将其更新为 "Hello World"。然后 '+=' 运算符进一步追加 "!!!", 最终输出为 "Hello World!!!"。

使用 .replace() 替换子字符串

字符串中的子字符串可以通过 C 风格字符串中的直接手动编辑以及 std::string 中的集成函数来替换为不同的字符串。

示例

让我们看一个例子来说明如何使用 .replace() 函数在 C++ 中替换子字符串。

示例

编译并运行

输出

After replace(): Hello C++

说明

'std::string::replace()' 方法从索引 '6' 开始,长度为 '5' 个字符(即 "World")将字符串的一部分替换为 "C++"。它将原始字符串修改为 "Hello C++",演示了 C++ 中子字符串替换的工作原理。

C++ 字符串的其他示例

C++ 字符串的其他几个示例如下:

1. C++ 字符串比较示例

让我们通过 strcmp() 函数看一个简单的字符串比较示例。

示例

编译并运行

输出

What is my favourite fruit? apple
What is my favourite fruit? banana
What is my favourite fruit? mango
The answer is correct!!

说明

在此程序中,使用 strcmp() 函数将用户输入与预定义的字符串 "mango" 进行比较。这将检查两个字符串之间的相等性。当用户输入 "mango" 时,strcmp() 返回 0,导致循环终止并显示 "Answer is correct!!"。

2. C++ 字符串连接示例

让我们通过 strcat() 函数看一个简单的字符串连接示例。

示例

编译并运行

输出

Enter the key string: Welcome to
Enter the buffer string: C++ Programming.
Key = Welcome to C++ Programming.
Buffer = C++ Programming.

说明

此程序使用 'strcat()' 函数连接两个 C 风格字符串,该函数将 'buffer' 字符串追加到 'key' 字符串。连接后,更新后的 'key' 包含两个字符串的组合,而 'buffer' 保持不变。

3. C++ 字符串复制示例

让我们通过 strcpy() 函数看一个简单的字符串复制示例。

示例

编译并运行

输出

Enter the key string: C++ Tutorial
Key = C++ Tutorial
Buffer = C++ Tutorial

说明

此程序使用 'strcpy()' 函数将 'key' 字符串的内容复制到 'buffer' 字符串中。复制后,'key' 和 'buffer' 都包含相同的字符串。

4. C++ 字符串长度示例

让我们通过 strlen() 函数看一个简单的查找字符串长度的示例。

示例

编译并运行

输出

Length of String = 26

说明

此程序使用 'strlen()' 函数计算字符串 "Welcome to C++ Programming" 的长度。它返回字符串中的字符数,不包括空终止符 ('\0')。

在 C++ 中将字符串传递给函数

a) 将 C 风格字符串传递给函数

C 风格字符串作为字符数组传递。使用 const 来防止在函数内部修改是一个好习惯。

b) 将 std::string 传递给函数

std::string 类提供了更安全、更灵活的方式来处理 C++ 中的字符串。通过引用传递 (const std::string&) 可避免不必要的复制。

为什么要使用 C++ 中的字符串?

  • 它高效地存储文本数据
  • string 类提供了多种功能,例如字符串连接、模式搜索和子字符串检索。
  • 使用 std::string 为用户提供了更安全的内存处理和简化的内存管理操作。

C++ 字符串函数

下表包含 C++ 中的一些字符串函数。

函数描述
int find(string& str,int pos,int n)用于查找参数中指定的字符串。
char& at(int pos)用于在指定位置 pos 访问单个字符。
string& append(const string& str)它在另一个字符串对象的末尾添加新字符。
string& replace(int pos,int len,string& str)它替换从字符位置 pos 开始并跨越 len 个字符的字符串的一部分。
void resize(int n)用于将字符串的长度调整为 n 个字符。
int size()它以字节为单位返回字符串的长度。
string substr(int pos,int n)它创建一个包含 n 个字符的新字符串对象。
void swap(string& str)用于交换两个字符串对象的值。
int length()用于查找字符串的长度。
int compare(const string& str)用于比较两个字符串对象。
Iterator begin()它返回第一个字符的引用。
char& back()它返回最后一个字符的引用。
int copy(string& str)它将一个字符串的内容复制到另一个字符串中。
string& assign()它为字符串分配新值。
void pop_back()它删除字符串的最后一个字符。
void push_back(char ch)它在字符串末尾添加一个新字符 ch。
int max_size()它查找字符串的最大长度。
string& insert()它在位置 pos 指示的字符之前插入一个新字符。
int find_last_not_of(string& str,int pos)它搜索最后一个不匹配指定序列的字符。
int find_last_of(string& str,int pos,int n)它用于在字符串中搜索指定序列的最后一个字符。
int find_first_not_of(string& str,int pos,int n )它用于在字符串中搜索第一个不匹配指定字符串中任何字符的字符。
int find_first_of(string& str,int pos,int n)它用于查找指定序列的第一次出现。
string& operator=()它为字符串分配新值。
string& operator+=()它在字符串末尾追加一个新字符。
char& front()它返回对第一个字符的引用。
string& erase()它删除指定的字符。
bool empty()它检查字符串是否为空。
const_char* data()它将字符串的字符复制到数组中。
const_reverse_iterator crbegin()它指向字符串的最后一个字符。
void clear()它从字符串中删除所有元素。
const_iterator cend()它指向字符串的最后一个元素。
const_iterator begin()它指向字符串的第一个元素。
int capacity()它返回为字符串分配的空间。
char operator[](pos)它检索指定位置 pos 的字符。
char* c_str()它返回一个指向包含空终止字符序列的数组的指针。
int rfind()它搜索字符串的最后一次出现。
iterator end()它引用字符串的最后一个字符。
reverse_iterator rend()它指向字符串的第一个字符。
void shrink_to_fit()它减小容量,使其等于字符串的大小。
const_reverse_iterator crend()它引用字符串的第一个字符。
reverse_iterator rbegin()它引用字符串的最后一个字符。
void reserve(int len)它请求更改容量。
allocator_type get_allocator();它返回与字符串关联的分配对象。

C++ 字符串选择题

1. 什么是 C++ 字符串?

  1. C++ 字符串由字符序列组成,其中整数存储在数组中。
  2. 字符序列驻留在以空终止符 (\0) 结尾的字符数组中。
  3. 字符序列存在于 std::string 对象中。
  4. B 和 C 均支持
 

答案:d) b 和 c 都是


2. 在 C++ 中,哪个头文件允许开发人员使用 std::string?

  1. <string>
  2. <cstring>
  3. <iostream>
  4. <stdlib.h>
 

答案:a) <string>


3. C++ 如何在存储中组织字符串数据?

  1. 整数集合
  2. 顺序字符集合
  3. 指向单个字符的指针
  4. 此数据类型仅包含数字内容
 

答案:b) 顺序字符集合


4. 哪个字符表示 C++ 内存中 C 风格字符串的终止?

  1. 用空格字符
  2. 用特殊分隔符
  3. 用空字符 (\0)
  4. 用换行符 (\n)
 

答案:c) 字符串以空字符 (\0) 结尾


5. 哪个标准函数确定使用 std::string 的 C++ 字符串的长度值?

  1. size()
  2. length()
  3. strlen()
  4. a 和 b 都是
 

答案:d) a 和 b 都是


下一个主题C++ 指针