C++ 提供了两种主要的字符串表示形式:C 风格字符串 和 C++ 的 string
类。本文将从两者的概念、用法以及各自的特性入手,详细解读它们的应用场景,并通过创新示例和读者常见疑问为你提供深入的理解。
C 风格字符串来源于 C 语言,其本质是一维字符数组,以空字符 \0
结尾。由于其简单、直接,至今在 C++ 中仍然广泛使用。
以下代码展示了两种等价的字符串声明方式:
#include
using namespace std;
int main() {
char site1[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
char site2[] = "RUNOOB";
cout << "Site 1: " << site1 << endl;
cout << "Site 2: " << site2 << endl;
return 0;
}
Site 1: RUNOOB
Site 2: RUNOOB
注意:site2
的初始化自动在末尾添加了空字符 \0
。而如果手动省略空字符(如 {'C', '+', '+'}
),则无法正确表示字符串。
C 风格字符串有许多函数可用,以下是常见的操作:
函数 | 功能 |
---|---|
strcpy(s1, s2) |
将字符串 s2 复制到 s1 中 |
strcat(s1, s2) |
将字符串 s2 连接到 s1 末尾 |
strlen(s1) |
返回字符串 s1 的长度 |
strcmp(s1, s2) |
比较 s1 和 s2 的内容,相等返回 0 |
strchr(s1, ch) |
找到 s1 中字符 ch 的首次出现位置 |
strstr(s1, s2) |
找到 s1 中子串 s2 的首次出现位置 |
#include
#include
using namespace std;
int main() {
char str1[20] = "runoob";
char str2[20] = "example";
char str3[20];
// 复制字符串
strcpy(str3, str1);
cout << "After strcpy: " << str3 << endl;
// 连接字符串
strcat(str1, str2);
cout << "After strcat: " << str1 << endl;
// 计算长度
cout << "Length of str1: " << strlen(str1) << endl;
return 0;
}
After strcpy: runoob
After strcat: runoobexample
Length of str1: 13
string
类string
类由 C++ 标准库提供,它弥补了 C 风格字符串的不足,为字符串操作提供了更加灵活和强大的支持。
\0
。append
、insert
、replace
等。#include
#include
using namespace std;
int main() {
string str1 = "runoob";
string str2 = "example";
string str3;
// 复制字符串
str3 = str1;
cout << "str3: " << str3 << endl;
// 拼接字符串
str3 = str1 + str2;
cout << "str1 + str2: " << str3 << endl;
// 获取长度
cout << "Length of str3: " << str3.size() << endl;
return 0;
}
str3: runoob
str1 + str2: runoobexample
Length of str3: 13
以下是 string
类常用操作的简要说明:
方法 | 功能 |
---|---|
append |
在末尾添加字符或字符串 |
find |
查找子字符串首次出现的位置 |
replace |
替换指定范围内的子字符串 |
substr |
提取子字符串 |
size /length |
返回字符串长度 |
#include
#include
using namespace std;
int main() {
string url = "www.example.com";
// 拼接
url.append("/C++");
cout << "Appended URL: " << url << endl;
// 查找并删除子串
size_t pos = url.find("/C++");
if (pos != string::npos) {
url.replace(pos, 4, ""); // 删除子串
}
cout << "Modified URL: " << url << endl;
// 提取子域名
size_t firstDot = url.find_first_of(".");
size_t lastDot = url.find_last_of(".");
cout << "Subdomain: " << url.substr(firstDot + 1, lastDot - firstDot - 1) << endl;
return 0;
}
Appended URL: www.example.com/C++
Modified URL: www.example.com
Subdomain: example
sizeof
vs strlen
两者虽然都与字符串相关,但功能和使用场景完全不同:
比较项 | sizeof |
strlen |
---|---|---|
定义 | 操作符,计算类型或对象所占内存大小 | 函数,计算字符串长度(不含 \0 ) |
编译时 vs 运行时 | 编译时计算 | 运行时计算 |
参数 | 类型或变量 | 仅限以 \0 结尾的 C 风格字符串 |
结果 | 返回数组所占总内存大小,包括 \0 |
返回字符串实际字符数,不含 \0 |
#include
using namespace std;
int main() {
char str[20] = "0123456789";
cout << "strlen: " << strlen(str) << endl; // 长度,不含 \0
cout << "sizeof: " << sizeof(str) << endl; // 总大小,含 \0
return 0;
}
strlen: 10
sizeof: 20
string
类 提供了更强大的功能,推荐在现代 C++ 中使用。sizeof
用于计算内存占用,strlen
用于计算字符串长度,需根据场景正确选择。掌握字符串操作的多样性和细节,可以让你的代码更加灵活、健壮!