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

5 回答 5

7

cin>>var;

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

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

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

根据您编辑的帖子

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

这会从缓冲区中提取字符并将它们存储到firstNameor ( lastName) 中,直到此处的定界字符 -newline ( '\n')。

于 2013-08-21T03:36:01.120 回答
1

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

对于您的情况,使用std::cin.ignore()afterstd::cin和 thengetline()忽略换行符:

cin>>ch;
cin.ignore();  //to skip the newline character in the buffer
getline(cin,var);
于 2013-08-21T03:30:32.250 回答
1

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

于 2013-08-21T03:30:52.790 回答
0

std::isstream::ignore()以前用过std::getline()std::cin.ignore()将从输入序列中提取第一个字符并丢弃它。

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

于 2013-08-21T03:48:23.853 回答
0

所以基本上,cin>>var 将 '\n' 字符排除在缓冲区之外。因此,现在当您调用 getline 时,它​​会读取 '\n' 字符并停止。因此,当我们在cin 之后使用它时,我们使用cin.ignore() 来忽略getline 读取的第一个字符,即'\n'。

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

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

希望这能回答你的问题。

于 2020-11-04T11:05:21.820 回答