可能重复:
Program is skipping over Getline() without taking user input
好吧,所以我有一个正在运行的程序,并且在开始时它会提示您填充数据成员的数据。该程序为3个不同的对象执行此操作。
我的问题是,在运行时,在输入第一个对象的数据后,程序继续跳过第二个名称的输入并直接进入下一个选项。它对第三个选项的名称也是一样的。当您有机会更改数据时,它也会执行此操作。
“输入CD名称:Microsoft Word
1-游戏
2个字的
3编译器
4电子表格
5的dBase
-6-介绍
输入与CD类型对应的数字:2
输入CD费用:15.23
输入CD名称:1-Game< - ((跳过输入部分并直接转到菜单!)
2个字的
3编译器
4电子表格
5的dBase
-6-介绍
输入与CD类型对应的数字:“
这个问题最有可能发生在我的会员功能中,但我不确定是什么问题。
这是我的会员功能代码:
void CDX::LoadInfo() //Prompts, validates and sets data members
{
cout << "Enter CD Name: ";
getline(cin, Name);
int choice=0;
do
{ cout << "1-Game\n2-Word\n3-Compiler\n4-Spreadsheet\n5-Dbase\n6-Presentation" << endl;
cout << "Enter the number that corresponds with the CD's Type: ";
cin >> choice;
} while ((choice <1)||(choice>6));
switch(choice)
//Code for case-switch statement goes here)
那我错过了什么?这是一个缓冲区问题还是我过早地以某种方式结束代码导致它跳过?
答案 0 :(得分:1)
当数字转换找到无法转换的字符时,它就会停止转换。 在这种情况下,角色是&#39; \ n&#39;
当你使用getline读取一行时,会读取并丢弃该字符,但是当你读取一个数字时,它会被读取(知道数字是否继续),如果它不是数字的一部分,它留在缓冲区中以供下次阅读。
实施例: 如果你写: &#34; 29312&#34; 然后按回车键,您的缓冲区将被填充 &#34; 29312 \ n&#34;
如果您使用cin&gt;&gt; number,要读取stdin,它会消耗数字,但会在缓冲区中留下&#34; \ n&#34;。 在下次调用getline时,它将读取留在缓冲区中的空行。
答案 1 :(得分:0)
我认为这是因为第一个'getline(cin,Name)'吞噬了最后一个换行符。输入费用并按ENTER键后,对getline
的调用即告完成。
您可以在花费成本后保留额外的getline
,以便消耗换行符。然后,我认为它会正常运行。
答案 2 :(得分:0)
您已阅读“CD Cost”,但换行符仍保留在输入缓冲区中。在读取CD名称之前跳过空格:
ws(cin);