您提供的关于输入问题的链接略有不同。它是指当您期望用户输入特定值时,但可能由于输入其他内容(比如整数)而无法读取该值。在这种情况下,最好使用
getline
来检索整行输入,然后解析出该值。
在您的情况下,您只需要单词。当您从流中读取字符串时,它将为您提供所有连续的非空白字符。而且,暂时忽略标点符号,您可以称之为“单词”。所以当您谈论“无效输入”时,我不明白您的意思。循环将继续向您提供“单词”,直到流中没有剩余的“单词”,此时它将报错:
vector<string> words;
string word;
while( cin >> word ) words.push_back(word);
然而,如果您期望用户在一行上输入所有单词并按回车键完成,则需要使用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);
}
cin
输入,所以没有文件末尾(在Linux中,你可以通过按Ctrl-D来使cin
结束)。 - paddy