梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)
本教程将全面讲解 C++ 中字符数组与 string 字符串的核心概念、使用方法、输入输出技巧,以及两者的相互转换,帮助你掌握字符串处理的核心能力。
字符数组:是存储字符类型数据的数组,本质是连续的字符存储空间,以 '\0'(空字符)作为结束标志,是 C 语言遗留的字符串处理方式。
string 字符串:是 C++ 标准库(STL)提供的字符串类,封装了字符数组的底层实现,提供了丰富的成员函数,是 C++ 中推荐的字符串处理方式。
| 特性 | 字符数组 | string 字符串 |
|---|---|---|
| 底层实现 | 固定长度的字符数组,手动管理内存 | 动态字符数组,自动管理内存 |
| 长度限制 | 定义时固定长度,超出易越界 | 动态扩容,无长度限制 |
| 操作便捷性 | 需手动调用C库函数(如strlen、strcpy) | 内置成员函数,支持直接赋值、拼接等 |
| 安全性 | 易出现越界、内存泄漏问题 | 自动处理边界,安全性更高 |
| 兼容性 | 兼容C语言,可直接用于C风格接口 | C++专属,需转换才能用于C风格接口 |
字符数组有多种定义和初始化方式,核心需注意 '\0' 结束符的自动补充。
#include <iostream>
// 字符数组操作需包含C字符串库
#include <cstring>
using namespace std;
int main() {
// 方式1:直接初始化(自动添加'\0')
char str1[] = "Hello C++";
cout << "str1: " << str1 << endl;
cout << "str1长度:" << strlen(str1) << endl; // 输出:9(不含'\0')
cout << "str1内存大小:" << sizeof(str1) << endl; // 输出:10(包含'\0')
// 方式2:指定长度初始化(剩余位置补'\0')
char str2[20] = "Character Array";
cout << "\nstr2: " << str2 << endl;
// 方式3:逐个字符初始化(需手动加'\0')
char str3[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "\nstr3: " << str3 << endl;
// 方式4:空字符数组(需后续赋值)
char str4[50];
strcpy(str4, "Manual Assignment"); // 用strcpy赋值
cout << "\nstr4: " << str4 << endl;
return 0;
}
字符数组支持流式输入输出(cin/cout)和格式化输入输出(scanf/printf),需注意输入时的空格处理。
#include <iostream>
using namespace std;
int main() {
char str[50];
cout << "请输入字符串(cin):";
cin >> str; // 输入:Hello World 只会读取"Hello"
cout << "输出:" << str << endl; // 输出:Hello
return 0;
}
#include <iostream>
using namespace std;
int main() {
char str[50];
cout << "请输入字符串(getline):";
cin.getline(str, 50); // 读取最多49个字符(留1位存'\0')
cout << "输出:" << str << endl; // 输入:Hello World 输出完整内容
return 0;
}
#include <iostream>
using namespace std;
int main() {
char str[] = "C++ Character Array";
cout << "直接输出:" << str << endl;
// 逐个字符输出
cout << "逐个输出:";
for (int i = 0; str[i] != '\0'; i++) {
cout << str[i];
}
cout << endl;
return 0;
}
#include <iostream>
#include <cstdio> // 格式化输入输出头文件
using namespace std;
int main() {
char arr[20];
// 格式化输入:%s 读取无空格字符串,自动补'\0'
cout << "输入字符串(无空格):";
scanf("%s", arr); // 字符数组名本身是地址,无需&
printf("格式化输出:%s\n", arr);
// 读取整行(包含空格):%[^\n] 匹配到换行符为止
char arr2[20];
getchar(); // 清空缓冲区换行符
cout << "输入带空格的字符串:";
scanf("%[^\n]", arr2);
printf("整行格式化输出:%s\n", arr2);
return 0;
}
string 是 C++ 标准库类,支持多种灵活的初始化方式,无需关注内存和结束符。
#include <iostream>
// 使用string需包含头文件
#include <string>
using namespace std;
int main() {
// 方式1:空字符串初始化
string str1;
str1 = "Empty String";
cout << "str1: " << str1 << endl;
// 方式2:直接赋值初始化
string str2 = "C++ String Class";
cout << "\nstr2: " << str2 << endl;
// 方式3:拷贝初始化
string str3 = str2;
cout << "\nstr3: " << str3 << endl;
// 方式4:部分初始化(从str2截取前5个字符)
string str4(str2, 0, 5);
cout << "\nstr4: " << str4 << endl;
// 方式5:重复字符初始化
string str5(5, 'A');
cout << "\nstr5: " << str5 << endl; // 输出:AAAAA
return 0;
}
string 的输入输出比字符数组更灵活,支持整行读取且无需担心长度限制。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cout << "请输入字符串(cin):";
cin >> str; // 输入:Hello C++ 读取"Hello"
cout << "输出:" << str << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cout << "请输入字符串(getline):";
// 忽略前一个换行符(避免cin残留的换行影响)
cin.ignore();
getline(cin, str); // 输入:Hello C++ String 完整读取
cout << "输出:" << str << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "C++ String 输出示例";
cout << "直接输出:" << str << endl;
// 逐个字符输出
cout << "逐个输出:";
for (int i = 0; i < str.size(); i++) {
cout << str[i];
}
cout << endl;
return 0;
}
string 类提供了丰富的成员函数,覆盖字符串的长度、拼接、查找、替换等操作:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "C++ String Function";
// 1. 长度相关:size()/length()(等价)
cout << "字符串长度:" << str.size() << endl;
cout << "字符串长度:" << str.length() << endl;
// 2. 拼接:+= / append()
str += " Test";
cout << "\n拼接后:" << str << endl;
str.append(" Append");
cout << "append拼接:" << str << endl;
// 3. 查找:find()
int pos = str.find("Function");
if (pos != string::npos) {
cout << "\n找到Function,位置:" << pos << endl;
}
// 4. 替换:replace()
str.replace(pos, 8, "Method"); // 从pos位置替换8个字符为"Method"
cout << "替换后:" << str << endl;
// 5. 截取:substr()
string sub = str.substr(0, 5); // 从0位置截取5个字符
cout << "\n截取子串:" << sub << endl;
// 6. 清空:clear()
str.clear();
cout << "清空后长度:" << str.size() << endl;
// 7. 判空:empty()
if (str.empty()) {
cout << "字符串为空" << endl;
}
return 0;
}
常用函数速查表:
size()/length():返回字符串长度empty():判断字符串是否为空clear():清空字符串append()/+=:字符串拼接find():查找子串位置,未找到返回string::nposreplace(pos, len, str):替换指定位置的字符substr(pos, len):截取子串compare():字符串比较(返回0表示相等)实际开发中常需在字符数组和 string 之间转换,以下是核心方法:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "Convert to Char Array";
// 方式1:c_str() (推荐,返回const char*)
const char* charArr1 = str.c_str();
cout << "c_str()转换:" << charArr1 << endl;
// 方式2:copy() (拷贝到已有字符数组)
char charArr2[50];
str.copy(charArr2, str.size(), 0); // 从0位置拷贝str.size()个字符
charArr2[str.size()] = '\0'; // 手动添加结束符
cout << "copy()转换:" << charArr2 << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
char charArr[] = "Convert to String";
// 方式1:直接赋值
string str1 = charArr;
cout << "直接赋值转换:" << str1 << endl;
// 方式2:构造函数初始化
string str2(charArr);
cout << "构造函数转换:" << str2 << endl;
// 方式3:assign() 赋值
string str3;
str3.assign(charArr);
cout << "assign()转换:" << str3 << endl;
return 0;
}
'\0',否则输出会出现乱码;cin.ignore() 清除后再用 getline();const char*,不可直接修改,需修改则拷贝到新数组;'\0' 结尾,需手动管理内存,易出现越界问题;掌握字符数组与 string 的使用和转换,是 C++ 字符串处理的核心,也是文件操作、网络编程等场景的基础能力。