c++ - 为什么在 cin.ignore() 之后 getline(cin, var) 不读取字符串的第一个字符?

标签 c++ input cin getline

我正在用 C++ 创建一个简单的控制台应用程序,它从用户那里获取字符串和字符输入。为了简单起见,我想使用 stringchar 数据类型将输入从 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 输入字符串时,它会忽略我的字符串的第一个字符。

是否可以使用 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);
}

最佳答案

cin>>var;

仅从缓冲区中获取 var,将 \n 留在缓冲区中, 然后立即被 getline

抓取

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

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

根据您的编辑帖子

你不必为 geline 使用 cin.ignore();

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

关于c++ - 为什么在 cin.ignore() 之后 getline(cin, var) 不读取字符串的第一个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18348350/

相关文章:

c++ - 具有特定颜色的像素不在它在 SFML 中的位置

c++ - Qt C++ 控制台服务器,等待套接字连接并同时接受输入?

javascript - React - 表单提交后清除输入值

c++ - 无法检测无效写入

c++ - 陷入构建游戏引擎的困境

c++ - 如何声明模板化函数以便可以在类构造函数/函数中传递

jquery - 在 focusout() 上附加文本以形成输入元素值

c++ - 以相反顺序打印数组,意外输出 (c++)

c++ - 为什么我必须在 C++ 中按 enter 两次才能获取行?

c++ - 如何刷新 cin 缓冲区?