将c_str()存储为char *

时间:2013-11-30 21:05:12

标签: c++ string const c-str

我正在尝试使用以下声明的函数: extern int stem(struct stemmer * z, char * b, int k)1

我正在尝试将C ++字符串传递给它,所以我想我会使用c_str()函数。它返回const char *。当我尝试将其传递给stem()函数时,我收到此错误:error: invalid conversion from 'const char*' to 'char*' [-fpermissive]

如何存储c_str()的结果,以便我可以将其与stem函数一起使用?

这是我正在运行的代码:

    struct stemmer * z = create_stemmer();
    char * b = s.c_str();
    int res = stem(z, b, s.length()); //this doesn't work
    free_stemmer(z);
    return s.substr(0,res);

6 个答案:

答案 0 :(得分:8)

您遇到的问题是c_str()返回无法修改的缓冲区(const),而stem()可能会修改您传入的缓冲区(不是const })。您应该复制c_str()的结果以获得可修改的缓冲区。

页面http://www.cplusplus.com/reference/string/string/c_str/提供了有关C ++ 98和11版本的更多信息。他们建议使用以下内容替换char * b = s.c_str();

char * b = new char [s.length()+1];
std::strcpy (b, s.c_str());

答案 1 :(得分:2)

您不应该尝试删除c_str()返回的字符串的常量:

char * b = s.c_str();

但您可以直接传递std::string内部缓冲区的地址:

int res = stem(z, static_cast<char*>(&s[0]), s.length());

答案 2 :(得分:1)

如果要stem()修改字符串,请复制它:

char * scpy= strdup( s.c_str()) ;
int res = stem(z, scpy, strlen( scpy)); 
free( scpy) ;

答案 3 :(得分:0)

使用const_cast:

int res = stem(z, const_cast<char*>(s.c_str()), s.length()+1);
free_stemmer(z);
return s.substr(0,res);

注意可能(或可能不需要)的长度+ 1表达式。 C风格的字符串(char *)在末尾有一个额外的空终止符(零字节,等效“\ 0”)。您的词干函数可能(或可能不)期望字符串末尾有一个空终止符 - 尝试两种变体。

另请注意,“词干”功能不应该尝试修改字符串,否则可能会发生不好的事情(警告基于@David Heffernan的评论)

答案 4 :(得分:0)

.c_str()

只返回一个指向数据的指针,我会更新stem函数以接受'const char*',除非您想要修改字符串中的数据,在这种情况下,您应该将其作为新的字符串对象传递。

如果您无法编辑干功能,可以投射它:

int res = stem(z, const_cast<char*>(s.c_str()), s.length());

答案 5 :(得分:-2)

这样做并不好,但没有什么能阻止你:

#include <iostream>
#include <string>
using namespace std;

void foo(char *ch)
{
  ch[0] = 'B';
}

int main()
{
  string str = "helo world";

  char *ch = const_cast<char *>(str.c_str());

  foo(ch);

  // Belo world
  cout << str << endl;

  return 0;
}