将 std::string 存储为字符数组

Storing std::string as character array

我正在尝试将 std::string 转换为 C 字符串(我的实际问题更接近于 ;我正在尝试解决方法)。

  1. 如何将 std::string 存储为字符数组?
  2. 为什么 std::string.data() 和 std::string.c_str() return 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)]’

我找不到相关的、已有的问题。

只需使用一个const char *

  std::string sstring = "I'm an std string!";

  const char * cstring = sstring.c_str();

  std::cout << cstring << std::endl;

如评论中所述,这听起来像是一个 XY 问题。但是如果你只是想复制字符串,你可以这样做:

char cstring[sstring.size() + 1];
strcpy(cstring, sstring.c_str());

请注意,VLA 不是 C++ 的一部分,但 g++ 会 'go with it',请参阅答案 here

将字符串分配给 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 *,因此允许分配通过,虽然这可能不是最好的方法,但它非常简单。