Você pode usar a std::string::find()
função para encontrar a posição do seu delimitador de string e, em seguida, usar std::string::substr()
para obter um token.
Exemplo:
std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"
A find(const string& str, size_t pos = 0)
função retorna a posição da primeira ocorrência de str
na sequência ou npos
se a sequência não for encontrada.
A substr(size_t pos = 0, size_t n = npos)
função retorna uma substring do objeto, iniciando na posição pos
e no comprimento npos
.
Se você tiver vários delimitadores, depois de extrair um token, poderá removê-lo (delimitador incluído) para prosseguir com as extrações subseqüentes (se desejar preservar a sequência original, basta usar s = s.substr(pos + delimiter.length());
):
s.erase(0, s.find(delimiter) + delimiter.length());
Dessa forma, você pode fazer um loop facilmente para obter cada token.
Exemplo completo
std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;
Resultado:
scott
tiger
mushroom
size_t last = 0; size_t next = 0; while ((next = s.find(delimiter, last)) != string::npos) { cout << s.substr(last, next-last) << endl; last = next + 1; } cout << s.substr(last) << endl;
mushroom
saídas fora do loop, ou seja,s = mushroom
std::string token = s.substr(s.find(delimiter) + 1);
, se você tem certeza de que ele existe (eu uso +1 no comprimento) ...Esse método usa
std::string::find
sem alterar a sequência original lembrando o início e o fim do token de substring anterior.fonte
Você pode usar a próxima função para dividir a string:
fonte
split("abc","a")
retornará um vetor ou uma única string"bc"
, onde acho que faria mais sentido se tivesse retornado um vetor de elementos["", "bc"]
. Usandostr.split()
no Python, foi intuitivo para mim que ele retornasse uma string vazia, casodelim
fosse encontrada no início ou no final, mas essa é apenas a minha opinião. Enfim, eu só acho que deveria ser mencionadoif (!token.empty())
problema mencionado pelo @kyriakosSt, bem como de outros problemas relacionados aos delimitadores consecutivos.if (!token.empty())
não parece suficiente para corrigi-lo.Para delimitador de string
Divida a string com base em um delimitador de string . Como dividir uma string com
"adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih"
base no delimitador"-+"
, a saída será{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}
Resultado
Para delimitador de caractere único
Seqüência de caracteres dividida com base em um delimitador de caracteres. Como a divisão de string
"adsf+qwer+poui+fdgh"
com delimitador"+"
produzirá{"adsf", "qwer", "poui", "fdg"h}
Resultado
fonte
vector<string>
, acho que chamará o construtor de cópias.Esse código divide as linhas do texto e adiciona todos em um vetor.
Chamado por:
fonte
vector<string> split(char *phrase, const string delimiter="\n")
O strtok permite passar vários caracteres como delimitadores. Aposto que se você passou "> =" sua sequência de exemplo seria dividida corretamente (mesmo que> e = sejam contados como delimitadores individuais).
EDIT, se você não quiser usar
c_str()
a conversão de string para char *, use substr e find_first_of para tokenizar.fonte
strtok()
seria necessário que eu usasse a matriz char em vez de string..c_str()
também é barato e fácil.Aqui está a minha opinião sobre isso. Ele lida com os casos extremos e usa um parâmetro opcional para remover entradas vazias dos resultados.
Exemplos
fonte
Isso deve funcionar perfeitamente para delimitadores de string (ou caractere único). Não esqueça de incluir
#include <sstream>
.O primeiro loop while extrai um token usando o primeiro caractere do delimitador de string. O segundo loop while ignora o restante do delimitador e para no início do próximo token.
fonte
Eu usaria
boost::tokenizer
. Aqui está a documentação explicando como criar uma função apropriada do tokenizer: http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htmAqui está um que funciona para o seu caso.
fonte
A resposta já está lá, mas a resposta selecionada usa a função apagar, que é muito cara, pense em uma string muito grande (em MBs). Portanto, eu uso a função abaixo.
fonte
string.split()
método Python .)Este é um método completo que divide a string em qualquer delimitador e retorna um vetor das strings cortadas.
É uma adaptação da resposta de ryanbwork. No entanto, sua verificação para:
if(token != mystring)
fornece resultados incorretos se você repetir elementos em sua string. Esta é a minha solução para esse problema.fonte
while (true)
é geralmente assustador de ver em um pedaço de código como este. Pessoalmente, eu recomendo reescrever isso para que a comparação comstd::string::npos
(ou, respectivamente, um cheque contramystring.size()
) torne owhile (true)
obsoleto.Se você não deseja modificar a sequência (como na resposta de Vincenzo Pii) e também deseja gerar o último token, convém usar esta abordagem:
fonte
PS: Funciona apenas se os comprimentos das cordas após a divisão forem iguais
fonte
Função:
Testes unitários:
fonte
fonte
fonte