将 std::string 存储为字符数组
Posted
技术标签:
【中文标题】将 std::string 存储为字符数组【英文标题】:Storing std::string as character array 【发布时间】:2017-04-03 19:08:36 【问题描述】:我正在尝试将 std::string
转换为 c 字符串(我的真正问题更接近 this;我正在尝试解决方法)。
-
如何将
std::string
存储为字符数组?
为什么 std::string.data() 和 std::string.c_str() 返回 char [(<anonymous> + 1)]
而不是预期的 const char*
?还是我把这些混在一起了,如果是这样,我该如何处理这些类型?
#include <string>
#include <iostream>
int main()
std::string sstring = "I'm an std string!";
char cstring[sstring.size()];
cstring = sstring.c_str();
std::cout << std::string(sstring.c_str());
return 0;
编译结果
scratch.cpp:10:11: error: incompatible types in assignment of ‘const char*’ to ‘char [(<anonymous> + 1)]’
我找不到相关的、预先存在的问题。
【问题讨论】:
std::string::data()
和 std::sring::c_str()
返回 const char*
。
你认为.c_str()
为什么会返回char [(<anonymous> + 1)]
?
你为什么要分配一个指向数组的指针?
这是一个公然的XY problem 场景。请说出你真正的问题。
在char数组之间复制cstrings的正确方法是std::strcpy
。 cstring = sstring.c_str();
语句试图直接分配给一个数组,但 c 数组是不可分配的。请注意,char cstring[sstring.size()];
不是标准 c++,但一些编译器支持它作为扩展。它不是便携式的。
【参考方案1】:
只需使用const char *
std::string sstring = "I'm an std string!";
const char * cstring = sstring.c_str();
std::cout << cstring << std::endl;
【讨论】:
或者只使用auto
让编译器推断出正确的类型;-)【参考方案2】:
正如 cmets 中提到的,这听起来像是一个 XY 问题。但如果你只是想复制字符串,你可以这样做:
char cstring[sstring.size() + 1];
strcpy(cstring, sstring.c_str());
请注意,VLA 不是 C++ 的一部分,但 g++ 会“使用它”,请参阅答案here。
【讨论】:
谢谢!我应该知道这一点;我不知道我是怎么忘记复制 c 字符串的。【参考方案3】:将字符串分配给 char 数组的工作方法如下:
#include <iostream>
#include <string>
int main(int argc, char **argv)
std::string s = "HELLO WORLD!";
char *cs = (char *)s.c_str();
std::cout << cs << '\n' << std::string(cs) << '\n';
return 0;
输出:
这是可行的,因为它将const char *
转换为char *
,因此允许分配通过,虽然这可能不是最好的方法,但它非常简单。
【讨论】:
以上是关于将 std::string 存储为字符数组的主要内容,如果未能解决你的问题,请参考以下文章