2012-11-10 51 views
0

我无法弄清楚什么是我的简单的IO问题:C++函数getline(),这个函数的第二轮不工作

这是我做的代码的IO:

cout << "Enter an Employee name: "; 
getline(cin, empName); 
cout << "Employee Position: " ; 
cin >> empPos; 
cout << "Enter the Number of Years of Experience: "; 
cin >> numOfExp; 
cout << "Enter the deprtment Number: "; 
cin >> deptNum; 

这里是我的错误输出: 第一次读取名称一切正常,但第二次它看起来像是自动的东西被传入名称而不要求用户输入任何名称。

这里是我的输出:

Name:    Unknown 
Department Number:   0 
Employee Position:   E 
Years of Experience:  0 
Salary:      0 
Total Number of Employees: 1 
Enter an Employee name: arasd d 
Employee Position: s 
Enter the Number of Years of Experience: 12 
Enter the deprtment Number: 12 
Name:      arasd d 
Department Number:   12 
Employee Position:   s 
Years of Experience:  12 
Salary:      0 
Total Number of Employees: 1 
Enter an Employee name: Employee Position: 

正如你所看到的最后一行的问题; 任何想法如何解决这个问题?

+0

'getline'在停止阅读时的行为有所不同。 – chris

+0

不要混合'getline'和'>>'。此外,您完全忘记检查任何输入操作的返回值。这基本上是一场灾难。 –

+0

我不想在这一点做任何错误检查,我只是想确保程序运行,假设用户输入正确的输入。 – EasyQuestions

回答

1

这个问题可能是你的std::getline()之前阅读的最后一件事是一个整数(或使用operator>>()别的东西。格式的输入操作员停止阅读时遇到不匹配的格式的第一个字符时。例如,对于一个整数读取停止输入一个非数字输入(除了前导符号)因此,在读取一个整数后,用于指示输入完成的换行符仍在输入缓冲区中。

要处理卡住换行符,你可以跳过任何领先的空白前cal 012 std::getline()

if (std::getline(std::cin >> std::ws, name)) { 
    ... 
} 

顺便说一句,有从来没有一种情况,你不想检查用户输入!用户输入总是需要检查,即使在最琐碎的程序中,输入为假定是正确的!它有助于大幅度查找实际问题。鉴于你的输出,它看起来好像tve输入实际上不匹配正在读取的内容...

+1

谢谢,但我通过在最后输入'cin.ignore()'来解决问题,因此每次读取输入时都会清除缓冲区。 – EasyQuestions

+0

请注意,使用'std :: cin.ignore()'是一个不足的修复!试着在换行符前输入一个空格:'123 \ n',然后你回到原来的位置。如果你可能有空白或空的名字,你可能想使用'std :: cin.ignore(std :: numeric_limits :: max(),'\ n');':这个跳过尽可能多的字符,以达到下一个换行。 Persinally,我认为在格式化和非格式化I/O之间切换时使用'std :: ws'要简单得多,也更加惯用。 –

+0

我想我不确定你想要我插入那段代码,但我测试了一个领先的空间而没有做任何修改,仍然有效。 – EasyQuestions