Та ссылка, которую вы предоставили относительно проблем с вводом, немного отличается. Речь идет о том, когда вы ожидаете, что пользователь введет определенное значение, но вы можете не прочитать значение (скажем, целое число), потому что было введено что-то еще. В этом случае хорошо использовать 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);
}
person
paddy
schedule
15.01.2013
while
наbreak
вне цикла, если условие выполняется. - person SShaheen   schedule 16.01.2013while(std::cin >> words)
, цикл становится бесконечным. - person chosentorture   schedule 16.01.2013break
вручную, если это необходимо. - person jrok   schedule 16.01.2013while(std::value)
, где значение является целым числом, то входные данные любого другого типа должны быть недействительными. Точно так же любые входные данные, кроме строк, должны быть недействительными, но входные данные также принимают целые числа и продолжают работать в коде, который я разместил. - person chosentorture   schedule 16.01.2013while(std << word)
остановится, как только вы введете неверный ввод. Я пробовал писать while(getline(cin,words)) но это также приводит к бесконечному циклу. - person chosentorture   schedule 16.01.2013cin
, конца файла нет (в Linux вы можете заставитьcin
завершиться, нажав Ctrl -Д). - person paddy   schedule 16.01.2013getline
и остановить цикл, когда пользователь дает вам пустую строку. Поток по-прежнему будет действительным, поэтому вам нужно проверить строку нулевой длины, а затем выйти из цикла. Я добавил код в свой ответ. - person paddy   schedule 16.01.2013if(words==" ")
после условия while, и теперь, если пользователь вводит пробел, цикл завершается. Хотя я должен был бы уведомить пользователя об этом. Спасибо за этот код! :) - person chosentorture   schedule 16.01.2013cin >> words
, то он никогда не должен давать вам строку, содержащую пробел, если вы явно не изменили входные разделители в потоке. - person paddy   schedule 16.01.2013while(getline(cin, words))
вместоwhile(cin >> words)
. После этого я написалif(words==" ")
и упомянул, что если пользователь введет пустую строку, то это будет считаться ложным вводом. Но после прочтения кода, который вы предоставили, я переключился на него и использовалif(words.size()==0)
, и это хорошо работает, если пользователь вводит новую строку во вводе, нажимая «Enter». - person chosentorture   schedule 16.01.2013