C++ C++;getline(),此函数的第二次运行不';行不通

C++ C++;getline(),此函数的第二次运行不';行不通,c++,input,getline,C++,Input,Getline,我不知道我的简单IO问题是什么: 这是我执行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 <<

我不知道我的简单IO问题是什么:

这是我执行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;
正如你看到的,最后一行是问题所在;
知道如何解决这个问题吗?

问题可能是在
std::getline()
之前阅读的最后一个内容是整数(或者使用
运算符>>()
。当遇到与格式不匹配的第一个字符时,格式化输入运算符将停止读取。例如,对于整数读取,将停止输入非数字(前导符号除外)。因此,在读取整数后,用于指示输入已完成的换行符仍在输入缓冲区中

要处理被卡住的换行符,您只需跳过任何前导空格,然后再计算
std::getline()


顺便说一句,在从不的情况下,你不想检查用户输入!用户输入总是需要检查,即使在假设输入正确的最琐碎的程序中也是如此!这有助于戏剧性地定位实际问题。考虑到你的输出,似乎tve输入实际上与b不匹配读取时…

getline
在停止读取时的行为不同。不要将
getline
>
混合在一起。此外,您完全忘记了检查任何输入操作的返回值。这基本上是一场灾难。我现在不想做任何错误检查,我只想简单地确保程序运行假设用户输入了正确的输入。至于混合使用getline和>>,我不知道如何读取中间有空格的字符串并将其存储到单个字符串变量中。谢谢,但我通过输入
cin.ignore()解决了这个问题
结尾,因此每次读取输入时都会清除缓冲区。注意,使用
std::cin.ignore()
是一个不足的修复程序!请尝试在换行符前面输入空格:
123\n
然后返回到原来的位置。如果可能有前导空格或空名称,则可能需要使用
std::cin.ignore(std::numeric_limits::max(),“\n”)
:这跳过了进入下一个换行符所需的尽可能多的字符。通常,我认为在格式化和非格式化I/O之间切换时使用
std::ws
更简单、更惯用。我想我不确定您希望我在哪里插入这段代码,但我用前导空格测试了它,没有做任何修改n仍然有效。关键是,
std::cin.ignore()
只忽略一个字符。如果输入一个数字,后跟一个空格,然后才输入,则当
std::getline()
。在这种情况下,您需要忽略多个字符。更准确地说,您需要忽略换行符之前的所有字符。这就是我前面的注释中对
std::cin.ignore()
的调用所做的。
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:
if (std::getline(std::cin >> std::ws, name)) {
    ...
}