当你在C++的程序中,经常会遇到两种字符串的表达方法,一种是以字符数组的方式,还有用string的,这二者到底有什么不同?下文将会帮彻底弄懂。
因为许多函数参数当需要传入字符串的时候,有的代码中使用指向字符数组的指针来传递字符串,其实C++中传入字符数组,就相当于传入一个指向该数组的指针。具体原因将会在我的其他博客里面介绍,因此搞懂字符数组和C++中的string是很有必要的。
C语言中的字符串和C++中的字符串在本质上有很大的不同。
一、C语言中的字符串
- 表示方式:
*C语言中的字符串是用字符数组表示的,并以空字符(‘\0’)结尾来标识字符串的结束。 - 定义和初始化:
char str1[] = "Hello, C!";
char str2[20] = "Hello, C!";
char str3[20];
strcpy(str3, "Hello, C!");
- 字符串操作
C语言中,操作字符串需要使用标准库中的函数,如strlen、strcpy、strcat、strcmp等。
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[] = ", World!";
strcat(str1, str2); // 拼接字符串
printf("%s\n", str1); // 输出:Hello, World!
int len = strlen(str1); // 计算字符串长度
printf("Length: %d\n", len); // 输出:12
return 0;
}
- 内存管理
需要手动管理内存。若使用动态分配,需自己负责释放内存,防止内存泄漏。
char *str = (char *)malloc(20 * sizeof(char));
strcpy(str, "Hello, C!");
// 使用完后要释放内存
free(str);
二、C++中的字符串
- 表示方式:
C++中引入了std::string类,提供了更高层次的字符串操作。 - 定义和初始化:
#include <iostream>
#include <string>
int main() {
std::string cppStr1 = "Hello, C++!";
std::string cppStr2("Hello, C++!");
std::string cppStr3;
cppStr3 = "Hello, C++!";
std::cout << cppStr1 << std::endl;
return 0;
}
- 字符串操作:
std::string类提供了丰富的成员函数,简化了字符串操作,如length、substr、find、replace等。
#include <iostream>
#include <string>
int main() {
std::string str1 = "Hello";
std::string str2 = ", World!";
str1 += str2; // 拼接字符串
std::cout << str1 << std::endl; // 输出:Hello, World!
size_t len = str1.length(); // 计算字符串长度
std::cout << "Length: " << len << std::endl; // 输出:12
std::string subStr = str1.substr(0, 5); // 获取子串
std::cout << "Substring: " << subStr << std::endl; // 输出:Hello
return 0;
}
- 内存管理:
std::string类自动管理内存,无需手动释放,防止了内存泄漏的问题。 - 功能和安全性:
std::string类具有异常处理机制,当操作越界或内存不足时,可以抛出异常,增强了代码的健壮性。更加方便和安全,减少了手动管理内存的错误风险。
三、总结
特性 | C语言 | C++ |
---|---|---|
表示方式 | 字符数组 | string类 |
结束符 | 空字符’\0’ | 不需要空字符 |
内存管理 | 手动管理 | 自动管理 |
操作函数 | 标准库函数(如strcpy等) | 成员函数(如length等) |
安全性 | 容易出错 | 更加安全 |