【问题标题】:Storing std::string as character array将 std::string 存储为字符数组
【发布时间】:2017-04-03 19:08:36
【问题描述】:

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

  1. 如何将std::string 存储为字符数组?
  2. 为什么 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++,但一些编译器支持它作为扩展。它不是便携式的。

标签: c++ string c++11 c-strings


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 2013-10-30
    • 1970-01-01
    • 2015-09-11
    • 2021-09-13
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多