C++ 跳过我的上一个cin输入
这是一个非常简单的程序,但我遗漏了一些东西。我被要求选择变量,这将是最有效的手段来存储数据,然后在用户输入此信息后,我将使用cout来显示它。但由于某种原因,它跳过了最后一条cin语句,不允许我输入char变量。我尝试在最后一个问题的提示之前使用cin.ignore(),但没有成功。代码如下: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;
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是短的?@πάνταῥεῖ 请看谢谢你的帮助。我需要更好地使用我的调试器。你知道我为什么会有这样的行为吗?为什么在输入错误的数据之后