Эффективный способ присвоения переменных из cin

Поэтому в прошлом мне приходилось вводить одну строку ввода с разными числами или буквами, разделенными пробелами (например, «1100 2 100 1»), и назначать каждый набор цифр или букв своей соответствующей переменной. Например, если пользователь вводит «1100 2 100 1», программа должна добавить первую строку чисел «1100» к массиву строк с именем «string1», «2» к типу int с именем «num», «100» к массиву строк. массив строк с именем «string2» и т. д.

Я всегда справлялся с этой проблемой с помощью серии циклов for, операторов if и счетчиков, чтобы помнить, где во вводе cin мы находимся:

// Takes in an input from the user and adds them to the required strings and chars to be used in main.

void addToList()
{
std::string temp;

std::getline( std::cin, temp );

// Takes each element from cin and stores them in variables accordingly.
int length = temp.length();

int i;
int j;
int k;
int l;

// Adds the first set of numbers from cin into the string array 'binarystr1'
for ( i = 0; i < length; i++ )
{
    if ( temp[i] == ' ' )
    {
        break;
    }

    if ( temp[i] >= 0 )
    {
        binarystr1 += temp[i];
    }

}

int bs1Length = binarystr1.length();

// Sets the char 'k1' to the second number in cin.
for ( j = bs1Length+1; j < length; j++ )
{

    if ( temp[j] == ' ' )
    {
        break;
    }

    if ( temp[j] >= 0 )
    {
        k1 = temp[j];
    }

}

int newLength = bs1Length + 3;

// Adds the 3rd line of numbers entered in cin to the string 'binarystr2'.
for ( k = newLength; k < length; k++ )
{
    if ( temp[k] == ' ' )
    {
        break;
    }
    if ( temp[k] >= 0 )
    {
        binarystr2 += temp[k];
    }
}

int bs2Length = binarystr2.length();
int lastLength = newLength + bs2Length+1;

// Sets char 'k2' to the last number entered in cin.
for ( l = lastLength; l < length; l++ )
{
    if ( temp[l] == ' ' )
    {
        break;
    }
    if ( temp[l] >= 0 )
    {
        k2 = temp[l];
    }
}
}

Как вы можете видеть, это очень уродливый и длительный процесс, поэтому, если кто-то может показать мне лучший способ разделения входных данных и их хранения в будущем, я был бы очень признателен. Спасибо!


person Sly Trash Panda    schedule 01.05.2017    source источник
comment
Что не так с std::cin >> string1 >> num >> string2?   -  person Corristo    schedule 01.05.2017
comment
Я никогда особо не использовал операторы '››', поэтому списываю свое решение на неопытность.   -  person Sly Trash Panda    schedule 01.05.2017


Ответы (1)


используйте stringstream следующим образом:

std::string input;
std::getline(std::cin,input);
std::stringstream inputStream(input);
// get any type, later
inputStream >> var1 >> var2 ...
person vahed mafi    schedule 01.05.2017
comment
Ооооо, классно. Спасибо за вашу помощь! - person Sly Trash Panda; 01.05.2017