C++ 跳过我的上一个cin输入

C++ 跳过我的上一个cin输入,c++,char,cout,cin,C++,Char,Cout,Cin,这是一个非常简单的程序,但我遗漏了一些东西。我被要求选择变量,这将是最有效的手段来存储数据,然后在用户输入此信息后,我将使用cout来显示它。但由于某种原因,它跳过了最后一条cin语句,不允许我输入char变量。我尝试在最后一个问题的提示之前使用cin.ignore(),但没有成功。代码如下: using namespace std; int main() { unsigned int population; float avg_income, hourly_wage;

这是一个非常简单的程序,但我遗漏了一些东西。我被要求选择变量,这将是最有效的手段来存储数据,然后在用户输入此信息后,我将使用cout来显示它。但由于某种原因,它跳过了最后一条cin语句,不允许我输入char变量。我尝试在最后一个问题的提示之前使用cin.ignore(),但没有成功。代码如下:

using namespace std;

int main()
{
    unsigned int population;
    float avg_income, hourly_wage;
    unsigned short int students, gnp_florida;
    char gender;

    // Instructions for all answers

    cout << "For all answers don't type a comma(,). For example the number 4,598,453.00 should be listed";
    cout << " as 4598453.00\n";


    // Get user input and assign it to the variables

    cout << "What is the population of the US?: ";
    cin >> population;
    cout << "What is the average family income in the US?: ";
    cin >> avg_income;
    cout << "Give the hourly wage of 1 family member: ";
    cin >> hourly_wage;
    cout << "Enter the total number of students attending SPC: ";
    cin >> students;
    cout << "What is the total GNP of Florida?: ";
    cin >> gnp_florida;
    cout << "Enter a gender (M for male or F for female): ";
    cin >> gender;

    // Display the variable's values using cout

    cout << "These are your answers......\n ";
    cout << "The total US population is " << population << endl;
    cout << "The average family income in the US is " << avg_income << endl;
    cout << "The hourly wage of 1 person in a household is " << hourly_wage << endl;
    cout << "The number of students attending SPC is " << students << endl;
    cout << "The GNP for Florida is " << gnp_florida << endl;
    cout << "The gender you entered is " << gender << endl;


    // Make the program beep 5 times using escape sequences
    cout << "\a\a\a\a\a";

    system("pause");
    return 0;
}

请解释发生了什么,并提前感谢您的帮助

您的代码的主要问题是您没有测试输入的结果:在尝试阅读后,您始终需要验证您的输入是否成功。如果您这样做了,您会注意到
gnp_florida
的输入失败。一旦输入失败,
std::istream
对象将进入故障模式,并且在故障模式为
clear()
ed之前,它们不会接受任何进一步的输入。方便地将流转换为
bool
,也就是说,您可以使用

if (!(std::cin >> value)) { report_error(); }
测试流是否遇到错误(对于那些想要挑剔答案的人:是的,我知道这个构造实际上没有经过到
bool
的转换,而是使用了为流定义的
操作符!()
;但是这个细节对于这个答案来说并不重要)

佛罗里达州国民生产总值的问题实际上有两个方面:

  • 输入的
    753896.45
    不是整数,而变量声明为
    unsigned int
    。这本身并不是一个错误。但是,小数点不是整数格式的一部分,即输入将在小数点之前停止,小数点将成为下一个输入读取的字符
  • 753896
    被解释为一个整数,但它太大,无法放入
    无符号短
    中,这是
    gnp_florida
    的类型!
    unsigned short
    的范围很可能是
    0
    65535
    (您可以通过打印
    std::numeric_limits::min()
    std::numeric_limits::max()
    来验证该范围)。试图读取一个对于要存储的变量来说太大的值会导致输入失败

  • 解决问题的方法是对
    gnp_florida
    使用
    double
    (显然,除了验证流是否处于良好状态之外):读取
    gnp_florida
    753896.45
    将成功并提取所有字符。使用
    double
    而不是
    float
    可以增加打印值时恢复所有8位数字的机会。

    代码的主要问题是您没有测试输入的结果:在尝试读取后,始终需要验证输入是否成功。如果您这样做了,您会注意到
    gnp_florida
    的输入失败。一旦输入失败,
    std::istream
    对象将进入故障模式,并且在故障模式为
    clear()
    ed之前,它们不会接受任何进一步的输入。方便地将流转换为
    bool
    ,也就是说,您可以使用

    if (!(std::cin >> value)) { report_error(); }
    
    测试流是否遇到错误(对于那些想要挑剔答案的人:是的,我知道这个构造实际上没有经过到
    bool
    的转换,而是使用了为流定义的
    操作符!()
    ;但是这个细节对于这个答案来说并不重要)

    佛罗里达州国民生产总值的问题实际上有两个方面:

  • 输入的
    753896.45
    不是整数,而变量声明为
    unsigned int
    。这本身并不是一个错误。但是,小数点不是整数格式的一部分,即输入将在小数点之前停止,小数点将成为下一个输入读取的字符
  • 753896
    被解释为一个整数,但它太大,无法放入
    无符号短
    中,这是
    gnp_florida
    的类型!
    unsigned short
    的范围很可能是
    0
    65535
    (您可以通过打印
    std::numeric_limits::min()
    std::numeric_limits::max()
    来验证该范围)。试图读取一个对于要存储的变量来说太大的值会导致输入失败

  • 解决问题的方法是对
    gnp_florida
    使用
    double
    (显然,除了验证流是否处于良好状态之外):读取
    gnp_florida
    753896.45
    将成功并提取所有字符。使用
    double
    而不是
    float
    可以增加在打印值时恢复所有8位数字的机会。

    您为佛罗里达州的GNP键入了
    753896.45
    ,这是一种
    double
    类型,而程序预期的是
    无符号的short


    当使用
    std::cin时,您为佛罗里达州的国民生产总值键入了
    753896.45
    ,这是一种
    double
    类型,而程序预期的是
    无符号短码


    当使用
    std::cin时,解决此类问题的正确工具是使用调试器,但在使用调试器之前不要询问堆栈溢出。请告诉我们您在第一位逐行检查代码时所做的所有观察。此外,您可能还想阅读]至少给我们留下一个重现您问题的答案。(这是πάντα提供的个人股票评论。)ῥεῖ™)什么类型的
    gnp_florida
    ?它可以容纳哪些数字?为什么输入浮点数时gnp_florida是短的?@πάνταῥεῖ 请看谢谢你的帮助。我需要更好地使用我的调试器。你知道我为什么会有这样的行为吗?为什么在输入错误的数据之后