Pergunta

Aqui está o meu código para encontrar uma seqüência em uma corda e substituindo-o por outro:

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

Tudo bem funciona quando eu chamar algo como:

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

Meu aplicativo requer me para substituir uma aspa simples com dois aspas simples, não um aspas duplas. Por exemplo, eu chamaria:

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

Mas sempre que eu chamar isso, a função congela-se por algum motivo. Alguém sabe o que pode ser a causa deste problema?

Edit: com base nas respostas que eu comecei, eu ter corrigido o código:

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

Espero que isso ajude algumas pessoas com o mesmo problema.

Foi útil?

Solução

Você tem um loop infinito, porque sua condição não avançar. Você está correndo sempre j = source.find( find ), mas você está substituindo ' com '', então você está sempre encontrando o primeiro apóstrofo cada vez e adicionando uma nova apóstrofo para a cadeia.

Você precisa ter certeza de que não combinam com o mesmo apóstrofo duas vezes movendo onde está a digitalizar a frente cada vez que você substituir algo.

A função find leva um segundo parâmetro que é a posição inicial na string para procurar a substring. Depois de encontrar a posição do primeiro jogo, mover a posição inicial até a posição mais o comprimento da corda que você está substituindo-o.

Outras dicas

Como você substituir 'com '', em seguida, procurar' novamente, encontrar o primeiro dos que você acabou de colocar lá. Que você substituir. E assim por diante.

Você está tentando substituir a mesma seqüência que você adicionou.

É provavelmente melhor para o trabalho da direita para a esquerda. Isso funciona para mim:

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top