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

时间:2013-08-21 03:22:39

标签: c++ input ignore getline cin

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

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

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

要获取字符输入,我正在使用 cin>> var 方法:

char var;
cin >> var;

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

是否可以使用 getline cin>> ,而无需使用忽略,或者我可以调用的方法以确保我的第一个角色没被跳过?

这是一个完整的代码示例,我使用 getline cin>>

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

5 个答案:

答案 0 :(得分:6)

cin>>var;

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

所以,以下情况很好,(如果我理解你的问题)

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

根据已修改帖子

您不必将cin.ignore();用于geline

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

因此,cin>>var基本上将'\ n'字符保留在其缓冲区之外。所以现在当你打电话 getline读取“ \ n”字符并停止。因此,我们使用cin.ignore()忽略在cin之后使用getline读取的第一个字符,即'\ n'。

但是getline不会保留'\ n'字符,而是将所有内容存储在缓冲区中,直到找到'\ n'字符,然后再存储'\ n'字符然后停止。

因此,在代码中,当您在getline之后使用cin.ignore()并再次使用getline进行输入时,它将忽略字符串的第一个字符而不是'\ n'。 这就是为什么第一个字符丢失的原因。

希望这能回答您的问题。