【问题标题】:C++ char * to string [duplicate]C ++ char *到字符串[重复]
【发布时间】:2010-08-01 02:34:58
【问题描述】:

可能重复:
how to copy char * into a string and vice-versa

我必须将值传递给需要 char * 的方法

MyMethod(char * parameter)
{
    // code
}

但是,我需要输入的参数当前是 std::string。如何将 std::string 转换为 char *?

std::string myStringParameter = //whatever

char * myCharParameter = //Convert here somehow

MyMethod(myCharParameter);

【问题讨论】:

标签: c++ string std casting


【解决方案1】:

您正在寻找c_str() 方法:

char * myCharParameter = myStringParameter.c_str();

您可能需要const_cast 将其返回到char * 而不是const char *。但是不要修改字符串;它是std::string 对象的内部缓冲区。如果你确实需要修改字符串,你应该使用strncpy将它复制到另一个缓冲区:

char * myCharParameter = new char[myStringParameter.length() + 1];
strncpy(myCharParameter, myStringParameter.c_str(), myStringParameter.length() + 1);

// And later...
myStringParameter.assign(myCharParameter);
delete [] myCharParameter;

【讨论】:

  • c_str() 返回 const char*,而不是 char *
  • @James McNellis 已经在问题中解决了这个问题。
  • @jdmichal:如果函数有char*类型的参数,它可能会修改指向的对象;使用 const_cast 抛弃 constness 是非常危险的,是个坏主意。
  • 好的,char 和 cstring 是一样的吗?我认为 cstring 是一种不同类型的对象?我是 C++ 新手,所以我还在学习这些东西。
  • char * 有时被称为“cstring”。这是因为 C 中的所有字符串都是这样存储的。
【解决方案2】:

这取决于 MyMethod 是否真的改变了传入的字符串。

如果您只知道签名,那么您必须假设它可以更改字符串,并根据@jdmichal 的回答将其复制到临时缓冲区中。

这个 API 的开发者也可能不知道或不关心 const 的正确性。所以这个函数接受一个非const 的缓冲区,即使它没有改变它。

如果是这样,您可以通过:

MyMethod(const_cast<char*>(myStringParameter.c_str());

在我的职业生涯中,我遇到过不少 API 采用非 const 字符串,而这些字符串应该是 const

【讨论】:

    【解决方案3】:

    如果函数真的要修改字符串,你最好创建一个单独的副本:

    std::string str = // ...
    char* cstr = strdup(str.c_str());
    MyMethod(cstr);
    // If you want to preserve the changes made:
    // str = cstr;
    free(cstr);
    

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 2012-07-24
      • 2012-01-16
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 2015-04-14
      • 2021-05-23
      • 2021-01-27
      相关资源
      最近更新 更多