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