c_str()

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::stringconst char*

std::string s = "Hello";
const char* cStr = s.c_str();
printf("%s\n", cStr);  // ✅ 使用 C 语言 `printf()`

📌 c_str()std::string 兼容 C 语言库函数(printfstrcpystrcmp 等)。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值