我正在用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);
}
答案 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()
将从输入序列中提取第一个字符并丢弃该字符。
答案 4 :(得分:0)
因此,cin>>var
基本上将'\ n'字符保留在其缓冲区之外。所以现在当你打电话
getline读取“ \ n”字符并停止。因此,我们使用cin.ignore()忽略在cin之后使用getline读取的第一个字符,即'\ n'。
但是getline不会保留'\ n'字符,而是将所有内容存储在缓冲区中,直到找到'\ n'字符,然后再存储'\ n'字符然后停止。
因此,在代码中,当您在getline之后使用cin.ignore()并再次使用getline进行输入时,它将忽略字符串的第一个字符而不是'\ n'。 这就是为什么第一个字符丢失的原因。
希望这能回答您的问题。