Pregunta

¿Cómo puedo obtener una lista de números de usuario y luego tokenize ellos.

Esto es lo que tengo pero no recibe nada, excepto para el primer número:

#include <iostream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;

int main()
{

    string line = "";
    cin >> line;

    stringstream lineStream(line);

    int i;
    vector<int> values;

    while (lineStream >> i)
        values.push_back(i);

    for(int i=0; i<values.size(); i++)
        cout << values[i] << endl;

    system("PAUSE");
    return 0;
}

Artículos Relacionados: Read C ++, al pasar de cadena a stringstream al vector
Int Tokenizer

¿Fue útil?

Solución

Creo cin >> roturas en los espacios en blanco, lo que significa que sólo está recibiendo el primer factor registrado.

intento:

getline(cin, line);

Otros consejos

Aquí es probablemente la forma más fácil de leer valores de cin en un recipiente:

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> values;
    std::copy(
        std::istream_iterator<int>(std::cin), 
        std::istream_iterator<int>(),
        std::back_inserter(values));

    // For symmetry with the question copy back to std::cout
    std::copy(
        values.begin(),
        values.end(),
        std::ostream_iterator<int>(std::cout,"\n"));

}

Al igual que Donnie mencionado rompe cin en los espacios en blanco, por lo que pueden sobrellevar esto podemos utilizar un 'getline ()', el siguiente ejemplo funciona muy bien:

#include <iostream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;

int main()
{

    string line = "";
    ::getline(std::cin,line,'\n');

    std::stringstream lineStream(line);

    int i;
    std::vector<int> values;

    while (lineStream >> i)
        values.push_back(i);

    for(int i=0; i<values.size(); i++)
        cout << values[i] << endl;

    system("PAUSE");
    return 0;
}

en la parte superior de principal

string line = "";
getline (cin, line );
stringstream lineStream(line);

Sí, y es la versión de serie de getline, sin la istream uno.

OK: Pavel Minaev tiene la mejor respuesta
. Pero toda la gente mencionar que rompe cin en el espacio blanco.
Eso es una buena cosa (ya que también ignora los espacios en blanco);

#include <iostream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;

int main()
{

    int i;
    vector<int> values;

    // prefer to use std::copy() but this works.
    while (std::cin >> i)
    {
        values.push_back(i);
    }

    // prefer to use std::copy but this works.
    for(vector<int>::const_iterator loop = values.begin();loop != values.end();++loop)
    {
        cout << *loop << endl;
    }

    return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top