如何阻止程序跳过getline?

时间:2010-11-01 07:32:22

标签: c++ input getline

这是我的主要计划,

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";
    }
}

输入关键字后,程序会立即输出:

输入名字:输入姓氏:

完全绕过了输入名字的能力。

3 个答案:

答案 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::ignorecin.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