运行时错误:程序跳过提示输入第二个和第三个名称

时间:2012-10-26 18:17:40

标签: c++

  

可能重复:
  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)

那我错过了什么?这是一个缓冲区问题还是我过早地以某种方式结束代码导致它跳过?

3 个答案:

答案 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);