Domanda

Ecco il mio codice per la ricerca di una sequenza in una stringa e la sua sostituzione con un altro:

std::string find_and_replace( string &source, string find, string replace )
{
    size_t j;
    for ( ; (j = source.find( find )) != string::npos ; )
    {
        source.replace( j, find.length(), replace );
    }
    return source;
}

Tutto funziona bene quando chiamo qualcosa come:

find_and_replace(test, "foo", "bar")

La mia applicazione mi richiede di sostituire una sola offerta con due virgolette singole, non una doppia citazione. Per esempio io chiamerei:

find_and_replace(test, "'", "''")

Ma ogni volta che chiamo questo, la funzione si blocca per qualche motivo. Qualcuno sa cosa potrebbe essere la causa di questo problema?

Modifica: sulla base delle risposte che ho ottenuto, ho fissato il codice:

std::string find_and_replace( string &source, string find, string replace )
{
    string::size_type pos = 0;
    while ( (pos = source.find(find, pos)) != string::npos ) {
        source.replace( pos, find.size(), replace );
        pos += replace.size();
    }
    return source;
}

Spero che questo aiuta alcune persone che hanno lo stesso problema.

È stato utile?

Soluzione

Hai un ciclo infinito perché la sua condizione non si muove in avanti. Sei sempre in esecuzione j = source.find( find ), ma si sta sostituendo ' con '', quindi sei sempre trovare la prima apostrofo ogni volta e l'aggiunta di un nuovo apostrofe alla stringa.

È necessario assicurarsi che non corrispondono allo stesso apostrofo due volte spostando in cui si esegue la scansione in avanti ogni volta che si sostituisce qualcosa.

La funzione find prende un secondo parametro che è la posizione iniziale nella stringa di cercare la stringa. Una volta trovata la posizione del primo match, spostare la posizione di partenza fino a quella posizione più la lunghezza della stringa si sta sostituendo con.

Altri suggerimenti

A causa di sostituire 'con '', quindi cercare' di nuovo, trovando il primo di quelli che hai appena messo lì. Il che si sostituisce. E così via.

Si sta cercando di sostituire la stessa stringa che è stato aggiunto.

E 'probabilmente meglio lavorare da destra a sinistra. Questo funziona per me:

const std::string& replacestring( std::string& strString, const std::string& strOld, const std::string& strNew )
{
    for ( int nReplace = strString.rfind( strOld ); nReplace != std::string::npos; nReplace = strString.rfind( strOld, nReplace - 1 ) )
    {
        strString.replace( nReplace, strOld.length(), strNew );
        if ( nReplace == 0 )
            break;
    }
    return strString;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top