/ **
编写一个程序,读取一系列数字并将它们存储在一个向量中。在用户输入他或她希望的所有号码之后,询问用户想要总和的号码的数量。对于答案N.打印矢量的前N个元素的总和。例如:"请输入一些数字(按'我'在提示停止时):" 12 23 13 24 15"请输入您希望总和的数字,从第一个开始:" 3"前3个数字的总和:12,23和13是48。"处理所有输入。例如,如果用户要求的数字总和的数量多于向量中的数字,请务必给出错误消息。
** /
#include<iostream>
#include<vector>
using namespace std;
int main()
{
try
{
vector<int> numbers;
int num;
cout<<"Now enter the numbers";
while(cin>>num)
numbers.push_back(num);
int n,sum=0;
cout << "Enter the nth number to find sum of elements till n : ";
cin>>n;
if(n >numbers.size())
throw 66;
for(int i=0;i<n;i++)
sum+=numbers[i];
cout << "sum is "<<sum;
return 0;
}
catch(int k)
{
cerr<<"Error "<<k;
return -1;
}
}
因此,当我输入EOF,CTRL + D时,程序终止。我不知道哪里出错了。我甚至尝试使用gdb进行调试(在在线教程的帮助下)。它没有成功。谁能告诉我代码有什么问题?
答案 0 :(得分:1)
你没有检查你是否真的读过任何东西。
Consider this little test program:
#include <iostream>
int main()
{
std::cout << "std::cin is " << (std::cin ? "ready" : "done") << "\n";
int n = -42;
std::cin >> n;
std::cout << n << "\n";
std::cout << "std::cin is " << (std::cin ? "ready" : "done") << "\n";
n = -42;
std::cin >> n;
std::cout << n << "\n";
std::cout << "std::cin is " << (std::cin ? "ready" : "done") << "\n";
}
输入时,输入空标准输入(相当于用ctrl + d立即声明结束):
std :: cin准备好了 -42
std :: cin完成了 -42
std :: cin已经完成
正如您所看到的,n
永远不会改变,因为永远不会有新的值来改变它!此外,您可以轻松发现std::cin
的状态反映了前一次读取是否超过了结束。
由于您只检查整数的值而没有确保它们具有合理的默认值(如果未通过读取输入设置,只检查n
会发生什么),这很容易导致您的程序表现出意想不到的行为。
注意:测试程序is different when fed input that simply is not a number的行为。
答案 1 :(得分:0)
当您使用EOF提供cin时,会导致cin.failbit
变为真。将failbit设置为true后,将忽略所有后续cin读取。由于n没有默认值,因此执行变得不可预测。在我的情况下程序崩溃,因为它抛出了66.在while循环之后添加cin.clear()
将解决这个问题,但是不可取。如果他们想要继续,两个简单的解决方案是在每次输入后停止魔术数字/提示用户。