为什么 cin.ignore() 后面的 getline(cin, var) 不读取字符串的第一个字符?

Why doesn't getline(cin, var) after cin.ignore() read the first character of the string?

本文关键字:cin 字符串 读取 第一个 字符 getline ignore 为什么 var      更新时间:2023-10-16

我正在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>>而不必使用忽略,或者我可以调用一个方法来确保我的第一个字符不会被跳过?

这是我同时使用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);
}

cin>>var;

仅从缓冲器中获取CCD_ 2,将CCD_ 3留在缓冲器中,然后立即被getline 捕获

所以,以下是很好的,(如果我正确理解你的问题)

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

根据编辑

geline 不必使用cin.ignore();

这将从缓冲区中提取字符,并将它们存储到firstName或(lastName)中,直到此处的定界字符为换行符('n')。

ignore()不跳过一行,而是跳过一个字符。你能发送示例代码并详细说明对cin.ignore()的需求吗?

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

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

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

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

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

因此,基本上,cin>>var将'\n'字符从缓冲区中排除。所以现在当你打电话getline读取'\n'字符并停止。因此,当我们在cin之后使用它时,我们使用cin.ignore()来忽略第一个字符getline reads,即'\n'。

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

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

希望这能回答你的问题。