将 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 [(&lt;anonymous&gt; + 1)] 你为什么要分配一个指向数组的指针? 这是一个公然的XY problem 场景。请说出你真正的问题。 在char数组之间复制cstrings的正确方法是std::strcpycstring = 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 存储为字符数组的主要内容,如果未能解决你的问题,请参考以下文章

根据缓冲区长度将空终止字符数组复制到 std::string

将 C 风格的字符串转换为 C++ std::string

将双精度转换为字符数组 C++

将十六进制字符串转换为字节数组

将 C++ 中的数组转换为字符串

在 std::string 中仅将数字转换为 int