首页 文章

C iostream:使用cin >> var和getline(cin,var)输入错误

提问于
浏览
2

我在C中创建一个简单的控制台应用程序,它从用户获取字符串和字符串输入 . 为简单起见,我想使用 stringchar 数据类型将输入从cin传递给 .

要获取字符串输入,我使用 getline 方法:

string var;
cin.ignore(); //I used ignore() because it prevents skipping a line after using cin >> var
getline(cin, var);

要获取char输入,我使用 cin >> var 方法:

char var;
cin >> var;

这在大多数情况下都可以正常工作 . 但是,当我使用 getline 输入字符串时,它会忽略我的字符串的第一个字符 .

是否可以使用 getlinecin >> 而不必使用 ignore ,或者我可以调用的方法以确保不跳过我的第一个字符?

这是一个完整的代码示例,我同时使用 getlinecin >>

string firstName;
string lastName;
char gender = 'A';

cout << "First Name: ";
cin.ignore();
getline(cin, firstName);


cout << "Last Name: ";
cin.ignore();
getline(cin, lastName);

while(genderChar != 'M' && genderChar != 'F')
{
    cout << "Gender (M/F): ";
    cin >> genderChar;
    genderChar = toupper(genderChar);
}

4 回答

  • 0

    cin>>var;

    只从缓冲区抓取 var ,它将 \n 留在缓冲区中,然后立即被 getline 抓取

    所以,以下就好了,(如果我理解你的问题)

    cin>>var;
    cin.ignore();     //Skip trailing '\n'
    getline(cin, var);
    

    根据你的 edited 帖子

    您不必使用 cin.ignore(); for geline

    这将从缓冲区中提取字符并将它们存储到 firstName 或( lastName )中,直到此处的分隔字符-newline( '\n' ) .

  • 5

    ignore() 不跳过一行,它会跳过一个字符 . 你能发送示例代码并详细说明是否需要 cin.ignore()

  • 1

    std::cin.ignore() 将忽略输入的第一个字符 .

    对于您的情况,请在 std::cin 之后使用 std::cin.ignore() ,然后使用 getline() 忽略换行符:

    cin>>ch;
    cin.ignore();  //to skip the newline character in the buffer
    getline(cin,var);
    
  • 1

    您在 std::getline() 之前使用 std::isstream::ignore() . std::cin.ignore() 将从输入序列中提取第一个字符并将其丢弃 .

    http://www.cplusplus.com/reference/istream/istream/ignore/

相关问题