3

我正在尝试使用具有以下声明的函数: 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);
4

6 回答 6

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());
于 2013-11-30T21:08:26.827 回答
2

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

char * b = s.c_str();

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

int res = stem(z, static_cast<char*>(&s[0]), s.length());
于 2013-11-30T21:12:15.550 回答
1

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

char * scpy= strdup( s.c_str()) ;
int res = stem(z, scpy, strlen( scpy)); 
free( scpy) ;
于 2013-11-30T21:11:56.420 回答
0

使用 const_cast:

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

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

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

于 2013-11-30T21:08:37.247 回答
0
.c_str()

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

如果你不能编辑 stem 函数,你可以转换它:

int res = stem(z, const_cast<char*>(s.c_str()), s.length());
于 2013-11-30T21:12:51.393 回答
-1

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

#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;
}
于 2013-11-30T21:10:57.730 回答