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
修改后可能失效,需要谨慎使用! 🚀