在C++中,string和char数组都是用来表示字符串的,但它们有不同的特性及用法。
关系对比
特性 | std::string | char 数组 |
内存管理 | 动态分配,自动管理 | 固定大小,手动管理 |
长度 | 可变 | 固定 |
安全性 | 避免缓冲区溢出 | 需要小心越界 |
功能 | 丰富的成员函数 | 只有C字符串函数 |
相互转换
- char数组转 string
#include <iostream>#include <string>using namespace std;int main() { // 1、直接赋值 char charArr[] = "Hello World"; string str1 = charArr; // 2、构造函数 string str2(charArr); // 3、通过assign方法 string str3; str3.assign(charArr); // 4、从char数组中截取部分创建字符串 char longArr[] = "What a nice to do nothing"; string str4(longArr, 4); // 只取前4个字符: "What" cout << "str1: " << str1 << endl; cout << "str2: " << str2 << endl; cout << "str3: " << str3 << endl; cout << "str4: " << str4 << endl; return 0;}2. string转char数组
#include <iostream>#include <string>#include <cstring>using namespace std;int main() { string str = "Hello World"; // 1、c_str() - 返回const char* const char* charP1 = str.c_str(); cout << "c_str(): " << charP1 << endl; // 2、data() - C++17起与c_str()相同 const char* charP2 = str.data(); cout << "data(): " << charP2 << endl; // 3、copy() - 复制到已有的char数组 char charArr1[20]; str.copy(charArr1, str.length()); charArr1[str.length()] = '\0'; // 手动添加结束符 cout << "copy(): " << charArr1 << endl; return 0;}3. vector<char>作为char数组的安全替代
#include <iostream>#include <string>#include <vector>using namespace std;int main() { string str = "Dynamic string"; // 安全地将string内容复制到vector<char> vector<char> charVec(str.begin(), str.end()); charVec.push_back('\0'); // 添加结束符 // 访问vector中的C字符串 cout << "Vector as string: " << &charVec[0] << endl; // 处理可能包含空字符的string string binaryData = "Hello"; binaryData += '\0'; // 插入空字符 binaryData += "World"; cout << binaryData << endl; // 使用data()和size()处理二进制数据 vector<char> binaryVec(binaryData.data(), binaryData.data() + binaryData.size()); cout << "Binary data size: " << binaryVec.size() << endl; cout << "Binary data: " << &binaryVec[0] << endl; return 0;}总结
- c_str()返回的指针在string修改后可能失效
- char数组需要手动管理内存和边界
- 优先使用std::string,除非需要与C API交互
- 使用std::vector<char>作为char数组的安全替代
总的来说,std::string更方便、更安全,而char数组在与C语言代码交互时更有用。根据具体需求选择合适的类型。
