C++ c_str() 方法
在 C++ 中,std::string::c_str() 返回指向字符串内容的 const char* 指针,使 std::string 兼容 C 风格字符串(char*)。
1. c_str() 基本用法
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
const char* cStr = str.c_str(); // ✅ `c_str()` 返回 `const char*`
std::cout << cStr << std::endl; // 输出: Hello, World!
}
📌 c_str() 使 std::string 可用于 C 语言 API(如 printf()、文件操作)。
2. c_str() 的作用
✅ std::string 转 const char*
std::string s = "Hello";
const char* cStr = s.c_str();
printf("%s\n", cStr); // ✅ 使用 C 语言 `printf()`
📌 c_str() 让 std::string 兼容 C 语言库函数(printf、strcpy、strcmp 等)。
3. c_str() 返回的指针的生命周期
🚨 c_str() 返回的 char* 在 std::string 修改后可能失效
std::string str = "Hello";
const char* cStr = str.c_str(); // ✅ `cStr` 现在指向 `str` 内部数据
str += ", World!"; // 🚨 `cStr` 可能失效
std::cout << cStr << std::endl; // ❌ 可能崩溃或输出错误
📌 std::string 发生修改(如 +=),内部存储可能被重新分配,c_str() 可能失效。
✅ 安全做法
std::string str = "Hello";
const char* cStr = str.c_str();
std::string copy = cStr; // ✅ 复制字符串,避免指针失效
4. c_str() vs data()
C++17 之前:
c_str()返回const char*,保证以\0结尾(适用于 C 函数)。data()返回const char*,但不保证以\0结尾(C++17 之前)。- C++17 之后,
data()和c_str()行为一致,都会返回\0结尾的char*。
std::string str = "Hello";
std::cout << str.c_str() << std::endl; // ✅ "Hello"
std::cout << str.data() << std::endl; // ✅ C++17 之后也可以安全使用
5. c_str() vs std::vector<char>
如果要存储可修改的字符串,推荐使用 std::vector<char>:
std::vector<char> vec(str.begin(), str.end());
vec.push_back('\0'); // ✅ 确保以 `\0` 结尾
char* rawStr = vec.data(); // ✅ 可修改
rawStr[0] = 'M'; // ✅ 修改字符串
📌 std::vector<char> 适用于 char* 需要可变的情况,而 c_str() 不能修改返回的字符串!
6. 关键总结
| 方法 | 返回类型 | 特点 |
|---|---|---|
c_str() | const char* | ✅ 以 \0 结尾,适用于 C API |
data()(C++17+) | const char* | ✅ 同 c_str() |
std::vector<char> | char* | ✅ 可修改 |
🚀 c_str() 适用于 C++ 兼容 C 代码,但返回的指针在 std::string 修改后可能失效,需要谨慎使用! 🚀
C++中c_str()方法的使用与注意事项
1073

被折叠的 条评论
为什么被折叠?



