2016-06-17 3 views
0

Я хочу заменить свой текст на boost как 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».

+0

Кажется, вы пытаетесь сделать что-то похожее на: [this] (http://stackoverflow.com/a/4289916/2690204). Вы можете посмотреть, как работает replace_all, вы не передаете строку для поиск и замена. – Hashman

+0

«Он не может преобразовать» не является хорошим, научным описанием проблемы. Чтобы сделать это хорошим вопросом для SO, подробно расскажите о проблеме, с которой вы сталкиваетесь, включая сообщения об ошибках и то, что вы сделали для их решения. –

ответ

2

В C++ строковых литералов (например, "a abc text") являются только для чтения, пытаясь изменить строковый литерал приведет к непредсказуемому поведению . Вот почему код, который вы показываете, должен заставить компилятор дать вам предупреждение (у вас есть неконстантный указатель на данные const), и если компилятор не предупреждает вас, вам нужно включить дополнительные предупреждения. Указатель на строковый литерал должен всегда на char const* или более распространенный const char *.

Если вы хотите модифицируемую строку, используйте std::string (или, если вы хотите, чтобы строки стиля C-стиля использовали char, например char find[] = "a abc text").

1

На самом деле вам не нужно использовать boost для чего-то столь же тривиального, как это.

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 символов в search и replace. Также обратите внимание, что если search и replace перекрываются, произойдет непредвиденное поведение. Если это важно для вас, вы должны переключить порядок for-loops (т. Е. Сначала j < k, затем i < 5).

+1

Но более выразительно инкапсулировать эту логику в функцию и более удобно использовать уже созданную для вас функцию и хорошо протестированную. –