C++ 字符串函数:strcpy()、strcat()、strlen()、strcmp()

⚡ 智能摘要

C++ 字符串函数(例如 strcpy、strcat、strlen 和 strcmp)允许程序复制、连接、测量和比较文本。本资源解释了什么是字符串,如何声明 C 风格的字符串和 std::string 类型的字符串,如何访问字符串的值,以及如何应用核心字符串函数并给出示例。

  • 🔤 核心定义: 字符串是一系列字符; C++ string 是 std::string 类的对象。
  • 🧱 两项声明: C++ 支持以'\0'结尾的 C 风格字符数组和更安全的 std::string 类类型。
  • 📥 访问值: 字符串按名称读取和打印,使用字符数组和 std::string 进行演示。
  • 🛠️ 字符串函数: strcpy 用于复制字符串,strcat 用于连接字符串,strlen 用于测量字符串长度,strcmp 用于比较两个字符串。
  • 📦 必填标题: C 字符串函数位于 cstring 头文件中,使用前必须包含该头文件。

C++ 字符串函数

什么是字符串?

字符串是字符的序列。 C++ string 是 std::string 类的对象。字符以字节序列的形式存储,允许访问单个字符字节。

C++ 字符串动态分配内存。如果需要,可以在运行时为字符串分配更多内存。由于没有预先分配内存,因此不会造成内存浪费。我们可以对字符串执行各种操作,包括比较、连接、转换等。

声明字符串

C++ 支持两种类型的字符串声明:

  • C 风格字符串
  • 字符串类类型

C 风格字符串

这种字符串声明方式是在……中引入的。 C语言. C++ 继续支持它。它本质上是一个以空字符 (\0) 结尾的一维字符数组。以空字符结尾的字符串由构成该字符串的字符后跟一个空字符组成。

考虑下面给出的字符串声明:

char name[5] = {'J', 'o', 'h', 'n', '\0'};

上述声明创建了一个字符串,其中包含单词“John”。该单词有 4 个字符,但字符串的长度为 5 个字符。多余的空格用于容纳空字符。

利用数组初始化规则,我们可以将上述语句写成如下形式:

char name[] = "John";

请注意,字符串常量末尾不需要添加空字符。 C++ 编译器在初始化数组时会自动在字符串末尾放置‘\0’。

标准::字符串

标准 C++ 库提供了字符串类,支持各种字符串操作。它的写法是 std::string。

要使用此类,我们必须首先使用 #include 预处理器将其包含到我们的工作区中,如下所示:

#include <string>

接下来,我们可以使用 string 关键字声明字符串。例如:

string name = "John";

上述语句将创建一个名为 name 的字符串来保存值 John。

访问字符串值

In C++,我们可以使用字符串名称访问字符串值。例如:

#include <iostream>
using namespace std;
int main() {
	char name[5] = { 'J', 'o', 'h', 'n', '\0' };
	cout << "String value is: ";
	cout << name << endl;
	return 0;
}

输出:

访问字符串值

以下是代码截图:

访问字符串值

Code 说明:

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包括 std 命名空间,以便使用其类和函数而无需调用它。
  3. 调用 main() 函数,程序逻辑应该添加到该函数中。{ 标记 main() 函数体的开始。
  4. 声明一个字符串并将其命名为 name。该字符串将存储值 John。多余的空间将存储空字符。
  5. 在控制台上打印一些文本。
  6. 在控制台上打印名为 name 的字符串的值。
  7. 如果程序运行正常,main() 函数应该返回一个值。
  8. main() 函数体结束。

这是使用 C++ 标准字符串类:

#include <iostream>
#include <string>
using namespace std;
int main() {

	string name = "Guru99";

	cout << "The name is : " << name << endl;

	return 0;
}

输出:

访问字符串值

以下是代码截图:

访问字符串值

Code 说明:

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 在我们的代码中包含标准字符串类。
  3. 包括 std 命名空间,以便使用其类和函数而无需调用它。
  4. 调用 main() 函数,程序逻辑应该添加到该函数中。{ 标记 main() 函数体的开始。
  5. 声明一个字符串并将其命名为 name。该字符串将存储值。 Guru99.
  6. 在控制台上打印字符串名称的值以及一些文本。
  7. 如果程序运行正常,main() 函数应该返回一个值。
  8. main() 函数体结束。

字符串函数 C++

您可能经常想要操作字符串。 C++ 它提供了一系列可用于此目的的函数。这些函数在以下位置定义:由于需要使用头部信息,所以我们必须将其包含在代码中才能使用这些函数。让我们讨论一些例子:

字符串()

这是字符串复制函数。它将一个字符串复制到另一个字符串中。

语法:

strcpy(string1, string2);

该函数的两个参数 string1 和 string2 均为字符串。该函数会将字符串 string2 复制到 string1 中。

字符串()

这是字符串连接函数。它连接字符串。

语法:

strcat(string1, string2);

该函数的两个参数 string1 和 string2 是要连接的两个字符串。上述函数会将字符串 string2 连接到字符串 string1 的末尾。

字符串()

这是字符串长度函数。它返回作为参数传递给它的字符串的长度。

语法:

strlen(string1);

参数string1是需要确定长度的字符串的名称。上述函数将返回字符串string1的长度。

strcmp()

这是字符串比较函数。它用于字符串比较。

语法:

strcmp(string1, string2);

如果字符串 string1 和 string2 相似,则上述函数将返回 0;如果 string1 < string2,则返回小于 0 的值;如果 string1 > string2,则返回大于 0 的值。

计费示例:

下面的例子演示了如何使用上述字符串函数:

#include <iostream>
#include <cstring>
using namespace std;
int main() {

	char name1[10] = "Guru99";
	char name2[10] = "John";
	char name3[10];

	int len;
	strcpy(name3, name1);
	cout << "strcpy( name3, name1) : " << name3 << endl;

	strcat(name1, name2);
	cout << "strcat( name1, name2): " << name1 << endl;

	len = strlen(name1);
	cout << "strlen(name1) : " << len << endl;
	return 0;
}

输出:

字符串函数 C++

以下是代码截图:

字符串函数 C++

Code 说明:

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包括标准我们代码中的头部信息。
  3. 包括 std 命名空间,以便使用其类和函数而无需调用它。
  4. 调用 main() 函数,程序逻辑应该添加到该函数中。{ 标记 main() 函数体的开始。
  5. 声明一个长度为 10 个字符的字符串,并将其命名为 name1。该字符串将存储值。 Guru99.
  6. 声明一个包含 10 个字符的字符串,并将其命名为 name2。该字符串将存储值 John。
  7. 声明一个由 10 个字符组成的字符串并将其命名为 name3。
  8. 声明 整型变量 名为 len。
  9. 将字符串 name1 复制到字符串 name3 中。
  10. 在控制台上打印字符串 name3 的值以及一些文本。它应该打印 Guru99.
  11. 将字符串 name2 连接到字符串 name1 的末尾。name1 的值现在是 Guru99约翰。
  12. 在控制台上打印字符串 name1 的值以及一些文本。它应该打印 Guru99约翰。
  13. 确定名为 name1 的字符串的长度,并将长度值赋给变量 len。
  14. 在控制台上打印 len 变量的值以及其他一些文本。
  15. 如果程序运行正常,main() 函数应该返回一个值。
  16. main() 函数体结束。

常见问题

是的。AI 助手可以将字符数组重构为 std::string,更新相关函数,并解释其安全性优势。开发人员仍应审查这些更改,以了解其对边界情况、缓冲区大小和预期行为的影响。

是的。AI 工具可以生成示例代码,解释 strcpy 和 strcat 函数的运行机制,并标记缓冲区溢出风险。这有助于理解,但亲自运行代码仍然是验证其行为的最佳方法。

std::string 可以动态管理内存,并提供诸如字符串连接和比较等内置操作。C 风格的字符串是以 '\0' 结尾的固定字符数组,需要手动管理内存,并且更容易出错。

如果目标数组太小,它们可能会导致缓冲区溢出。更安全的替代方案包括 strncpy、strncat 或直接使用 std::string 操作,这些操作会自动管理内存并降低这些风险。

总结一下这篇文章: