2013-08-21 107 views
2

我在C++中创建了一个简单的控制台应用程序,该应用程序从用户处获取字符串和字符输入。为了简单起见,我想使用字符串char数据类型将输入从cin传递给。C++ iostream:使用cin >> var和getline(cin,var)输入错误

要获得字符串输入,我使用的是函数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 >>,而不必使用忽略的方法,或者我可以打电话,以确保我的第一个字符是不是跳过?

这是一个代码全样本,我同时使用函数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); 
} 
+0

我不明白你对cin.ignore()的评论。根据它的api定义,它将放弃你输入的字符串的第一个字符,就像你现在遇到的场景一样。 –

+0

@JinChen抱歉,修正。我的意思是说,如果我不使用ignore(),它会跳过一行输入。 – miguelarcilla

+0

仍然很奇怪,cin.ignore()不应该像那样行为。你能提供更多的问题代码吗? –

回答

4

cin>>var;

只抓住从缓冲区中var,它的叶子在缓冲区中的\n, ,然后立即被getline

于是抓起,以下是蛮好的,(如果我的理解正确你的问题)

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

根据你编辑

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

这种提取从缓冲区,并将它们存储字符转换成firstName或(lastName),直到这里的划定字符-newline('\n')。

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

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

+0

我更新了一些示例代码的问题:)但我认为我的问题变得有点不清楚在这个过程中。 – miguelarcilla