Qual é a maneira eficaz de substituir todas as ocorrências de um personagem por outro std::string
?
c++
algorithm
str-replace
stdstring
big-z
fonte
fonte
std::string
é um contêiner projetado especificamente para operar com sequências de caracteres. linkstd::string::replace()
invés destd::replace()
! 'x' (char
) é implicitamente convertido parasize_t
[valor 120], portanto, toda a cadeia de caracteres ou parte dela será preenchida com 120 cópias de 'y'.Também pensei em lançar a solução boost :
fonte
-I
sinalizadores para o seu compilador para que ele encontre as bibliotecas do Boost no seu sistema. Talvez você precise instalá-lo primeiro.A questão está centrada na
character
substituição, mas, como achei esta página muito útil (especialmente a observação de Konrad ), gostaria de compartilhar essa implementação mais generalizada, que também permite lidar comsubstrings
:Uso:
Saídas:
EDITAR:
O exposto acima pode ser implementado de uma maneira mais adequada, caso as performances sejam de sua preocupação, retornando nothing (
void
) e realizando as alterações diretamente na stringstr
fornecida como argumento, passada por endereço em vez de por valor . Isso evitaria cópias inúteis e caras da string original, enquanto retornava o resultado. Sua ligação, então ...Código:
Espero que isso seja útil para alguns outros ...
fonte
from
string está vazia, caso contrário, um loop sem fim ocorrerá.Imagine um blob binário grande em que todos os 0x00 bytes sejam substituídos por "\ 1 \ x30" e todos os 0x01 bytes por "\ 1 \ x31" porque o protocolo de transporte não permite \ 0-bytes.
Nos casos em que:
as soluções fornecidas não podem ser aplicadas (porque substituem apenas caracteres únicos) ou têm um problema de desempenho, porque chamariam string :: replace várias vezes, o que gera cópias do tamanho do blob repetidamente. (Eu não sei a solução de reforço, talvez esteja tudo bem nessa perspectiva)
Este percorre todas as ocorrências na string de origem e constrói a nova string peça por peça uma vez :
fonte
Uma simples localização e substituição de um único caractere seria algo como:
s.replace(s.find("x"), 1, "y")
Para fazer isso para toda a cadeia, a coisa mais fácil a fazer seria fazer um loop até você
s.find
começar a retornarnpos
. Suponho que você também pode pegarrange_error
para sair do loop, mas isso é meio feio.fonte
{
personagem. Não sei o que é uma "chave dupla". Talvez você tenha algum tipo de problema de fonte?Se você estiver procurando substituir mais de um caractere e estiver lidando apenas com
std::string
, então esse trecho funcionaria, substituindo sNeedle no sHaystack por sReplace, e sNeedle e sReplace não precisam ter o mesmo tamanho. Essa rotina usa o loop while para substituir todas as ocorrências, e não apenas a primeira encontrada da esquerda para a direita.fonte
find
ligação duas vezes. Considere tornar esse resultado uma variável temporária.Como Kirill sugeriu, use o método de substituição ou itere ao longo da cadeia substituindo cada caractere independentemente.
Como alternativa, você pode usar o
find
método oufind_first_of
dependendo do que você precisa fazer. Nenhuma dessas soluções fará o trabalho de uma só vez, mas com algumas linhas extras de código você deve fazê-las funcionar para você. :-)fonte
fonte
word
for longo, pode haver muita sobrecarga ao chamar a função. Você pode otimizar isso passandoword
,target
ereplacement
como referências const.E o Abseil StrReplaceAll ? No arquivo de cabeçalho:
fonte
Moda antiga :-)
Resultado:
fonte
Isso funciona! Usei algo semelhante a isso para um aplicativo de livraria, onde o inventário foi armazenado em um CSV (como um arquivo .dat). Porém, no caso de um único caractere, o que significa que o substituto é apenas um único caractere, por exemplo, '|', ele deve estar entre aspas duplas "|" para não lançar um constante constante de conversão inválido.
Infelizmente, estou usando o CentOS atualmente, então minha versão do compilador está abaixo. A versão C ++ (g ++), C ++ 98 padrão:
fonte
Se você estiver disposto a usar
std::string
s, poderá usar astrsub
função desse aplicativo de amostra como está ou atualizá-la se desejar que ele use um tipo ou conjunto de parâmetros diferente para atingir aproximadamente o mesmo objetivo. Basicamente, ele usa as propriedades e funcionalidades destd::string
para apagar rapidamente o conjunto de caracteres correspondente e inserir os caracteres desejados diretamente nostd::string
. Toda vez que faz essa operação de substituição, o deslocamento é atualizado se ainda puder encontrar caracteres correspondentes para substituir e, se não puder mais devido a substituição, ele retornará a string em seu estado desde a última atualização.Se você não quiser usar
std::string
s como parâmetros para passar as seqüências de estilo C, poderá ver o exemplo atualizado abaixo:fonte
Para situações simples, isso funciona muito bem sem o uso de qualquer outra biblioteca e, em seguida, std :: string (que já está em uso).
Substitua todas as ocorrências do caractere a pelo caractere b em some_string :
Se a sequência for grande ou várias chamadas a serem substituídas forem um problema, você poderá aplicar a técnica mencionada nesta resposta: https://stackoverflow.com/a/29752943/3622300
fonte
aqui está uma solução que eu criei, no espírito máximo de DRI. ele pesquisará sNeedle no sHaystack e o substituirá por sReplace, nTimes se não for 0, caso contrário, todas as ocorrências de sNeedle. não procurará novamente no texto substituído.
fonte