Por exemplo, eu tenho um usuário que insere um número de telefone.
cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;
Desejo remover os caracteres "(", ")" e "-" da string. Eu olhei para as funções de remoção, localização e substituição de strings, no entanto, só vejo que elas operam com base na posição.
Existe uma função de string que posso usar para passar um caractere, "(" por exemplo, e fazer com que ele remova todas as instâncias de uma string?
std::remove
move os itens não removidos para a frente do vetor e retorna um iterador apontando logo além do último item não removido. Em seguida,std::erase
corta o vetor desse iterador até o final.string chars("()-");
e, em seguida, usar o.length()
método para obter o comprimento e o.at(i)
método para acessar os caracteres :) Violino funcionalizado - ideone.com/tAZt5I<iostream>
<algorithm>
<cstring>
Você pode usar o
std::remove_if()
algoritmo para remover apenas os caracteres que especificar:O
std::remove_if()
algoritmo requer algo chamado predicado, que pode ser um ponteiro de função como o snippet acima.Você também pode passar um objeto de função (um objeto que sobrecarrega o
()
operador de chamada de função ). Isso nos permite criar uma solução ainda mais geral:Você pode especificar quais caracteres remover com a
"()- "
string. No exemplo acima, adicionei um espaço para que os espaços sejam removidos, bem como parênteses e travessões.fonte
ispunct(int c)
remove_if () já foi mencionado. Mas, com C ++ 0x, você pode especificar o predicado para ele com um lambda.
Abaixo está um exemplo disso com 3 maneiras diferentes de fazer a filtragem. Versões de "cópia" das funções também estão incluídas para os casos em que você está trabalhando com um const ou não deseja modificar o original.
fonte
Aqui está uma solução diferente para todos os interessados. Ele usa o novo intervalo For em c ++ 11
fonte
str2
inicialização não é necessária. (2)str = std::move(str2)
seria mais eficiente.Infelizmente, não existe tal membro para std :: string, mas você pode facilmente programar esse tipo de funções. Pode não ser a solução mais rápida, mas bastaria:
EDIT: Lendo a resposta abaixo, entendi que fosse mais geral, não apenas para detectar dígito. A solução acima irá omitir todos os caracteres passados na segunda string de argumento. Por exemplo:
Vai resultar em
fonte
Nota: É possível que você precise escrever
ptr_fun<int, int>
ao invés de simplesptr_fun
fonte
std::cref
oustd::function
(ou lambdas).Sim, você pode usar a função isdigit () para verificar se há dígitos :)
Aqui está:
Espero que ajude :)
fonte
boost::is_any_of
Retire todos os caracteres de uma string que aparecem em outra string:
Testado no Ubuntu 16.04, Boost 1.58.
fonte
Se você tiver acesso a um compilador que ofereça suporte a modelos variados, poderá usar este:
fonte
Aqui está outra alternativa:
Funciona com std :: string e std :: wstring
fonte
Eu sou novo, mas algumas das respostas acima são extremamente complicadas, então aqui está uma alternativa.
NOTA: Desde que 0-9 sejam contíguos (o que deve ser de acordo com o padrão), isso deve filtrar todos os outros caracteres, exceto números e ''. Sabendo que 0-9 deve ser contíguo e um char é realmente um int, podemos fazer o seguinte.
EDIT: Eu não percebi que o pôster queria espaços também, então eu o alterei ...
Abaixo é para filtrar os caracteres fornecidos.
fonte
Usando std :: wstring e wchar_t (requer o cabeçalho Unicode ):
... próximo inicializador de intervalo estático sofisticado; não é necessário configurar badChars2 exatamente da mesma maneira. É um exagero; mais acadêmico do que qualquer outra coisa:
Lambda simples e conciso:
Remove todos os caracteres ruins do telefone
Resultado: "555 5555555"
fonte
Para aqueles que preferem um estilo de codificação lambda mais conciso e fácil de ler ...
Este exemplo remove todos os caracteres não alfanuméricos e de espaço em branco de uma string larga. Você pode misturá-lo com qualquer um dos outros ctype.h funções auxiliares para remover testes baseados em caracteres de aparência complexa.
(Não tenho certeza de como essas funções lidariam com as linguagens CJK, então vá com cuidado.)
Veja se você não acha isso mais fácil de entender do que loops barulhentos em C / C ++ para / iterador:
newLabel resulta após executar este código: " 1ReplenMoveRPMV "
Este é apenas acadêmica, uma vez que seria claramente mais precisa, concisa e eficiente para combinar a lógica 'se' a partir lambda0 (primeira for_each ) no único lambda1 (segunda for_each ), se você já estabeleceu que os personagens são os "badChars" .
fonte
Muitas respostas boas, aqui está outra maneira de limpar uma sequência de números, não é deletar caracteres, mas mover os números para fora.
fonte