3

次の宣言で関数を使用しようとしています: extern int stem(struct stemmer * z, char * b, int k)1

c_str()C++文字列を渡そうとしているので、関数を使用すると思いました。返します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

2

によって返される文字列の constness を削除しようとしないでくださいc_str()

char * b = s.c_str();

std::stringの内部バッファのアドレスを直接渡すことができます:

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
.c_str()

データへのポインターを返すだけです。文字列内のデータを変更したい場合を除き、を受け入れるようにステム関数を更新し'const char*'ます。その場合は、新しい文字列オブジェクトとして渡す必要があります。

ステム関数を編集できない場合は、キャストできます。

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 に答える