Pregunta

Estoy tratando de averiguar cómo podría analizar esta cadena usando "sstream"Y C ++

El formato de esto es: "String, int, int".

Necesito poder asignar la primera parte de la cadena que contiene una dirección IP a una cadena std ::.

Aquí hay un ejemplo de esta cadena:

std::string("127.0.0.1,12,324");

Entonces necesitaría obtener

string someString = "127.0.0.1";
int aNumber = 12;
int bNumber = 324;

Mencionaré de nuevo que no puedo usar boost Biblioteca, solo sstream :-)

Gracias

¿Fue útil?

Solución

Aquí hay una función de tokenización útil. No usa transmisiones, pero puede realizar fácilmente la tarea que necesita dividiendo la cadena en las comas. Luego puede hacer lo que quiera con el vector 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;
}

Otros consejos

los Biblioteca de kit de herramientas de cadena C ++ (STRTK) tiene la siguiente solución a su 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;
}

Se pueden encontrar más ejemplos Aquí

No es elegante, pero puedes usar std :: getline para dividir la cadena:

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);
}

Luego puede extraer la información necesaria de cada una de las cadenas separadas.

También podrías hacer algo como esto (creo totalmente fuera de mi cabeza, así que disculpé si cometí algunos errores allí) ...

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top