Чтение последовательности слов, чтобы добавить их в вектор

Я недавно купил C ++ Primer и застрял с проблемой. Я должен прочитать последовательность слов, используя cin и сохранить значения в vector, После необычных проблем я узнал, что while(cin >> words) вызывает проблемы (например, бесконечный цикл), если вы ожидаете неверные входные данные: Использование cin для получения пользовательского ввода

int main()
{
string words;
vector<string> v;
cout << "Enter words" << endl;
while (cin >> words)
{
v.push_back(words);
}
for(auto b : v)
cout << b << "  ";
cout << endl;
return 0;
}

Поэтому я пытаюсь найти альтернативу этой проблеме. Помогите ?

2

Решение

Ссылка, которую вы указали относительно проблем ввода, немного отличается. Речь идет о том, когда вы ожидаете, что пользователь введет определенное значение, но вы можете не прочитать значение (скажем, целое число), потому что было введено что-то еще. В этом случае это хорошо использовать getline получить целую строку ввода и затем проанализировать значение.

В твоем случае ты просто за словами. Когда вы читаете строку из потока, она выдаст вам все последовательные непробельные символы. И, игнорируя пунктуацию на мгновение, вы можете назвать это «словом». Поэтому, когда вы говорите о «неверном вводе», я не понимаю, что вы имеете в виду. Цикл будет продолжать давать вам «слова», пока в потоке не останется ни одного слова, и в этот момент произойдет ошибка:

vector<string> words;
string word;
while( cin >> word ) words.push_back(word);

Однако, если вы ожидаете, что пользователь введет все слова в одну строку и нажмете Enter, чтобы закончить, то вам нужно использовать getline:

// Get all words on one line
cout << "Enter words: " << flush;
string allwords;
getline( cin, allwords );

// Parse words into a vector
vector<string> words;
string word;
istringstream iss(allwords);
while( iss >> word ) words.push_back(word);

Или вы можете сделать это:

cout << "Enter words, one per line (leave an empty line when done)\n";

vector<string> words;
string line;
while( getline(cin, line) )
{
// Because of the word check that follows, you don't really need this...
if( line.size() == 0 ) break;

// Make sure it's actually a word.
istringstream iss(line);
string word;
if( !(iss >> word) ) break;

// If you want, you can check the characters and complain about non-alphabet
// characters here...  But that's up to you.

// Add word to vector
words.push_back(word);
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru