Как вводить массив строк string без заданного размера, чтобы при нажатии enter ввод останавливался?

Например, у меня есть массив строк string str[256] и я через getline (cin, str[i], ' ') в цикле for записываю слова. Но ввод не остановится, если не задать размер поменьше. Как сделать так, чтобы при нажатии enter ввод останавливался? Это должен быть именно string массив.


Ответы (2 шт):

Автор решения: Chorkov

Сперва прочитайте строку целиком, в уже потом, разбирайте ее на отдельные слова.

std::vector<std::string> words;
std::string line;
std::getline(std::cin, line); // читаем строку целиком
std::istringstream line_stream(line); // делаем из этой строки отдельный поток ввода
for( std::string word; line_stream>>word ; )
    words.push_back(word);
→ Ссылка
Автор решения: AR Hovsepyan

Дело в том, что при вводе std::string из потока, читаются символы_разделители и выбрасываются. Поэтому вы таким образом не сможете знать был ли достигнут терминатор. Хоть это не важно, но тут getline вовсе не нужна_ вы и так прочтете строку до пробела.

Для решения вопроса с вашим подходом(читать строки до символа терминатора, придется считывать из буфера символ и проверить:

  • если считанный символ является терминатором(в данном случаи '\n'), то выйти из цикла;
  • если считанный символ не ваш разделитель(в данном случаи пробел), то положить обратно в буфер и читать строку.

Код может быть таким:

const char term = '\n';
for (int i = 0;  i < 255;  ++i)
{    
    char c = cin.get();
    if (c == term)
        break;
    else if (c != ' ') {
        cin.unget();
        cin >> str[i];
        //использование можно добавить
        cout << str[i] << ' ';
    }
    //...
}
→ Ссылка