运行时间错误:程序跳过提示,以获取第二名和第三个名称

Run Time Error: Program skipping prompt for second and third names

本文关键字:三个 第二名 获取 程序 错误 提示 运行时间      更新时间:2023-10-16

可能的重复:
程序正在跳过getline(),而无需使用用户输入

好吧,所以我有一个正在运行的程序,一开始就提示您获取数据成员的数据。该程序可用于3个不同的对象。

我的问题是,在运行时,在输入拳头对象的数据后,程序将跳过第二个名称的输入,然后直接进入下一个选项。对于第三个选项的名称,它可以做同样的事情。当您有机会更改数据时,它也可以做到这一点。

'输入CD名称:Microsoft Word

1场

2字

3卷

4-Spreadsheet

5-DBase

6-呈现

输入与CD类型相对应的数字:2

输入CD成本:15.23

输入CD名称:1游戏< - (((跳过输入零件,直接带您到菜单!))

2字

3卷

4-Spreadsheet

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-Gamen2-Wordn3-Compilern4-Spreadsheetn5-Dbasen6-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)

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

当数字找到无法转换的字符时,数字的转换会停止。在这种情况下,角色为' n'

当您使用getline读取一行时,将读取和丢弃此字符,但是当您读取一个数字时,它会读取(知道数字是否继续),如果不是数字的一部分,则将留在缓冲区中以进行下一个读取。

示例:如果您写信:" 29312"然后按Enter,您的缓冲区将填充" 29312 n"。

如果您使用cin>>编号,则读取stdin,它将消耗数字,但会留在" n"的缓冲区中。下次您致电Getline时,它将读取一个空的线路,该线路留在缓冲区中。

我认为这是因为第一个'getline(cin,name)'gobles gothbles上一个newline Keypress。当您输入成本并按Enter时,呼叫getline已完成。

拿起成本后,您可以保留额外的getline,以便消耗新线。然后,我认为它将正确运行。

您已读取" CD成本",但Newline仍保留在输入缓冲区中。在阅读CD名称之前跳过空格:

ws(cin);
相关文章: