2016-06-17 21 views
0

Ich möchte meinen Text mit Boost wie PHP ersetzen.Char * ersetzen durch 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); 

Aber er kann "char * const" nicht in "int" umwandeln.

+0

Es scheint, dass Sie versuchen, etwas Ähnliches zu tun: [this] (http://stackoverflow.com/a/4289916/2690204) Sie möchten vielleicht sehen, wie replace_all funktioniert, Sie geben keine Zeichenfolge für suchen und ersetzen. – Hashman

+0

"Er kann nicht konvertieren" ist keine gute, wissenschaftliche Problembeschreibung. Um dies zu einer guten Frage für SO zu machen, beschreiben Sie detailliert das Problem, dem Sie gegenüberstehen, einschließlich Fehlermeldungen und was Sie getan haben, um sie zu lösen. –

Antwort

2

In C++ Stringliterale (wie "a abc text") sind versucht nur, lesen wörtliche eine Zeichenfolge zu ändern, wird-undefinierten Verhalten führen. Deshalb sollte der Code, den Sie anzeigen, dazu führen, dass der Compiler Ihnen eine Warnung gibt (dass Sie einen nichtkonstanten Zeiger auf const Daten haben), und wenn der Compiler Sie nicht warnt, müssen Sie weitere Warnungen aktivieren. Ein Zeiger auf ein String-Literal sollte immer durch char const* oder den häufiger const char *.

Wenn Sie eine änderbare Zeichenfolge möchten, verwenden Sie std::string (oder, wenn C-Style-String Arrays von char verwenden möchten, wie char find[] = "a abc text").

1

Sie brauchen Boost für etwas so Triviales nicht zu verwenden.

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]; 
    } 
} 

Beachten Sie, dass dieser Code geht davon aus, dass es 5 Zeichen in search und replace. Beachten Sie außerdem, dass sich bei Überlappung von search und replace ein unerwartetes Verhalten ergibt. Wenn das für Sie wichtig ist, sollten Sie die Reihenfolge der for-Schleifen ändern (d. H. Zuerst j < k, dann i < 5).

+1

Aber es ist expressiver, diese Logik in einer Funktion zu kapseln, und bequemer, eine Funktion zu verwenden, die bereits für Sie gemacht und gut getestet wurde. –