无法在以下代码中输入n(cin>> n)

时间:2015-04-08 05:01:25

标签: c++ error-handling

/ **

编写一个程序,读取一系列数字并将它们存储在一个向量中。在用户输入他或她希望的所有号码之后,询问用户想要总和的号码的数量。对于答案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进行调试(在在线教程的帮助下)。它没有成功。谁能告诉我代码有什么问题?

2 个答案:

答案 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()将解决这个问题,但是不可取。如果他们想要继续,两个简单的解决方案是在每次输入后停止魔术数字/提示用户。