2016-06-17 8 views
0

私のテキストをboost like phpに置き換えたいと思います。Char *をcharに置き換えてください。

char* find = "a abc text"; 
char* search[] = { "a", "b", "c", "d", "e" }; 
char* replace[] = { "f", "g", "h", "i", "j" }; 
boost::replace_all(find, search, replace); 

しかし、彼は "char * const"を "int"に変換することはできません。 C++文字列リテラル("a abc text"のような)で

+0

同様のことをしようとしているようです:[this](http://stackoverflow.com/a/4289916/2690204)replace_allがどのように動作し、検索と置換。 – Hashman

+0

"彼は変換することはできません"良い、科学的な問題の説明ではありません。これについての良い質問をするには、エラーメッセージやそれらを解決するために何をしたかなど、直面している問題を詳細に記述してください。 –

答えて

2

のみを読んでいる、リテラル文字列を変更しようとすると、未定義の動作につながります。そのため、あなたが表示するコードは、コンパイラに(constデータへの非constポインタを持つ)警告を出させ、コンパイラが警告を出さない場合には、より多くの警告を有効にする必要があります。文字列リテラルへのポインタは、常にchar const*またはより一般的なconst char *である必要があります。

変更可能な文字列を使用する場合は、std::string(またはcharのCスタイルの文字列使用配列を使用する場合は、char find[] = "a abc text"など)を使用します。

1

実際にはこれほど簡単ではないものにブーストを使用する必要はありません。

char value[]  = "foobar"; 
const char *search = "abcde"; 
const char *replace = "fghij"; 

size_t i, j, k = strlen(value); 

for (i = 0; i < 5; i ++) { 
    for (j = 0; j < k; j ++) { 
     if (value[j] == search[i]) 
      value[j] = replace[i]; 
    } 
} 

このコードは5つの文字がsearchreplaceであることを前提としています。 searchreplaceが重なっていると、予期しない動作が発生することにも注意してください。これが重要な場合は、for-loopsの順番を変更する必要があります(最初は、次にi < 5)。

+1

しかし、そのロジックを関数にカプセル化する方がより表現力があり、既にあなたのために作られた関数を使いやすく、よくテストされています。 –

関連する問題