这是我的主要计划,
int main () {
string command;
cin>>command;
if(command == "keyword")
{
string str, str2, str3, str4;
cout << "Enter first name: ";
getline (cin,str);
cout << "Enter last name: ";
getline (cin,str2);
cout << "Enter age: ";
getline (cin,str3);
cout<<"Enter country: ";
getline (cin,str4);
cout << "Thank you, " << str <<" "<<str2 <<" "<<str3<<" "<<str4<< ".\n";
}
}
输入关键字后,程序会立即输出:
输入名字:输入姓氏:
完全绕过了输入名字的能力。
答案 0 :(得分:3)
string command;
cin>>command;
之后只需吃完行的结尾
string restOfLine;
getline(cin, restOfLine);
否则输入命令行中的'\ n'不会被消耗,下一个readline只读取它。 HTH
答案 1 :(得分:3)
cin >> command
不从输入流中提取换行符('\n'
);当你致电getline()
时,它仍在那里。因此,您需要对getline()
(或ignore()
)进行额外的虚拟调用来处理此问题。
答案 2 :(得分:1)
正如其他人所提到的,问题是在读取命令时你会在缓冲区中留下行尾字符。除了@Armen Tsirunyan提出的替代方案,您还可以使用另外两种方法:
使用std::istream::ignore
:cin.ignore( 1024, '\n' );
(假设行的宽度不超过1024个字符。
只需将cin >> command
替换为getline( cin, command )
。
这两种选择都不需要创建额外的字符串,第一个是较弱的(在非常长的行中),第二个替代修改语义,因为现在整个第一行(不仅仅是第一个单词)被处理为命令,但这可能没问题,因为它允许您执行更严格的输入检查(命令拼写在第一个单词中,并且命令行中没有额外的选项。
如果你有不同的命令集,有些可能需要一个参数,你可以一次读取命令行,然后从那里读取命令和参数:
std::string commandline;
std::vector<std::string> parsed_command;
getline( cin, commandline );
std::istringstream cmdin( commandline );
std::copy( std::istream_iterator<std::string>(cmdin), std::istream_iterator(),
std::back_inserter( parsed_command ) );
// Here parsed_command is a vector of word tokens from the first line:
// parsed_command[0] is the command, parsed_command[1] ... are the arguments