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

Foi útil?

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() );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top