我无法弄清楚为什么我的程序会跳过“cin.getline(staffMember,100);”。如果我添加一个像'q'这样的分隔符,它会按预期工作。我不确定为什么它会像自动输入新行一样。有人可以向我解释为什么会这样吗?
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream> // Allow use of the ifstream and ofstream statements
#include <cstdlib> // Allow use of the exit statement
using namespace std;
ifstream inStream;
ofstream outStream;
void showMenu();
void addStaffMember();
void showMenu()
{
int choice;
do
{
cout
<< endl
<< "Press 1 to Add a New Staff Member.\n"
<< "Press 2 to Display a Staff Member.\n"
<< "Press 3 to Delete a Staff Member.\n"
<< "Press 4 to Display a Report of All Staff Members.\n"
<< "Press 5 to Exit.\n"
<< endl
<< "Please select an option between 1 and 5: ";
cin >> choice;
switch(choice)
{
case 1:
addStaffMember();
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
cout << "You did not select an option between 1 and 5. Please try again.\n";
}
} while (choice != 5);
}
void addStaffMember()
{
char staffMember[100];
cout << "Full Name: ";
cin.getline(staffMember, 100);
outStream.open("staffMembers.txt", ios::app);
if (outStream.fail())
{
cout << "Unable to open staffMembers.txt.\n";
exit(1);
}
outStream << endl << staffMember;
outStream.close();
}
int main()
{
showMenu();
return 0;
}
答案 0 :(得分:4)
当用户输入选项时,他们键入一个数字,然后按Enter键。这会将包含\n
字符的输入放入输入流中。当您执行cin >> choice
时,将提取字符,直到找到\n
,然后这些字符将被解释为int
。但是,\n
仍然在流中。
稍后,当您执行cin.getline(staffMember, 100)
时,它会向上读取\n
,并且看起来好像您输入了一个新行而没有实际输入任何内容。
要解决此问题,请使用ignore
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
这将提取所有内容,包括下一个\n
字符并丢弃它。事实上,这甚至会在用户输入类似1banana
的内容时处理。 1
将由cin >> choice
提取,然后该行的其余部分将被忽略。
答案 1 :(得分:0)
执行cin >> choice;
时,新行由cin
保留。因此,当您接下来执行getline
时,它将读取此换行符并返回空(或空格)字符串。
答案 2 :(得分:0)
使用
scanf("%d\n", &choice);
或者您可以在cin&gt;&gt; choice;
之后使用虚拟getchar()现在,\n
被跳过,正如几个答案中所解释的那样。
答案 3 :(得分:0)
cin
与getline()
混合在一起 - 尽量不要在同一代码中混用。
尝试使用它吗?
char aa[100];
// After using cin
std::cin.ignore(1);
cin.getline(aa, 100);
//....