Como analisar a string complexa com C ++?
Pergunta
Estou tentando descobrir como eu poderia analisar essa string usando "sstream
"E C ++
O formato é: "String, int, int".
Preciso atribuir a primeira parte da string que contém um endereço IP a uma string std ::.
Aqui está um exemplo desta string:
std::string("127.0.0.1,12,324");
Eu precisaria então obter
string someString = "127.0.0.1";
int aNumber = 12;
int bNumber = 324;
Vou mencionar novamente que não posso usar boost
Biblioteca, apenas sstream
:-)
Obrigado
Solução
Aqui está uma função de tokenização útil. Ele não usa fluxos, mas pode executar facilmente a tarefa que você precisa dividir a string em vírgulas. Então você pode fazer o que quiser com o vetor resultante de tokens.
/// String tokenizer.
///
/// A simple tokenizer - extracts a vector of tokens from a
/// string, delimited by any character in delims.
///
vector<string> tokenize(const string& str, const string& delims)
{
string::size_type start_index, end_index;
vector<string> ret;
// Skip leading delimiters, to get to the first token
start_index = str.find_first_not_of(delims);
// While found a beginning of a new token
//
while (start_index != string::npos)
{
// Find the end of this token
end_index = str.find_first_of(delims, start_index);
// If this is the end of the string
if (end_index == string::npos)
end_index = str.length();
ret.push_back(str.substr(start_index, end_index - start_index));
// Find beginning of the next token
start_index = str.find_first_not_of(delims, end_index);
}
return ret;
}
Outras dicas
o C ++ String Toolkit Library (STRTK) tem a seguinte solução para o seu problema:
int main() { std::string data("127.0.0.1,12,324"); string someString; int aNumber; int bNumber; strtk::parse(data,",",someString,aNumber,bNumber); return 0; }
Mais exemplos podem ser encontrados Aqui
Não é sofisticado, mas você pode usar o std :: getline para dividir a string:
std::string example("127.0.0.1,12,324");
std::string temp;
std::vector<std::string> tokens;
std::istringstream buffer(example);
while (std::getline(buffer, temp, ','))
{
tokens.push_back(temp);
}
Em seguida, você pode extrair as informações necessárias de cada uma das cordas separadas.
Você poderia fazer algo assim também, eu acredito (totalmente do topo da minha cabeça, então peço desculpas se eu cometi alguns erros lá) ...
stringstream myStringStream( "127.0.0.1,12,324" );
int ipa, ipb, ipc, ipd;
char ch;
int aNumber;
int bNumber;
myStringStream >> ipa >> ch >> ipb >> ch >> ipc >> ch >> ipd >> ch >> aNumber >> ch >> bNumber;
stringstream someStringStream;
someStringStream << ipa << "." << ipb << "." << ipc << "." << ipd;
string someString( someStringStream.str() );