questões de aspas simples com C ++ localizar e substituir função
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.
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;
}