在C ++ 11中使用异常时的无限循环

时间:2018-07-16 09:19:09

标签: c++ c++11 g++ gnu

我想创建一个使用10个正整数并为用户提供总数的c ++ 11程序。如果输入的是负数或字符,则应引发异常,并且用户必须重新输入其值。

下面的程序使用负数。但是,当我输入“ a”这样的字符时,程序进入无限循环,我无法弄清原因。

任何人和所有帮助将不胜感激

#include <iostream>

int main(){
    int array[10] = {0};
    int total = 0;

    for(int i =0; i < 10; i++){
        std::cout<<"Number "<< i+1 << ": " <<std::endl;
        std::cin >> array[i];
        try{       
            if(array[i] < 0 || std::cin.fail())
                throw(array[i]);
        }
        catch(int a){
            std::cout<< a <<" is not a positive number! "<<std::endl;
            i-=1; // to go back to the previous position in array
        }
    }
    for(int k = 0; k < 10; k++)
        total+=array[k];

    std::cout<<"Total: " <<total<<std::endl;
}

2 个答案:

答案 0 :(得分:0)

如果输入无效,则需要做两件事:

  1. 清除流状态。这是通过clear函数完成的。

  2. 从缓冲区中删除无效的输入。通常使用ignore函数。


对于您的程序,这里不需要例外,只需使用 unsigned 整数并检查状态就足够了:

unsigned int array[10] = { 0 };

...

if (!(std::cin >> array[i])
{
    std::cout << "Please input only non-negative integers.\n";

    // First clear the stream status
    std::cin.clear();

    // Then skip the bad input
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    // Make sure the index isn't increased
    --i;
}

要使用与您现在相似的异常,解决方案与上面的几乎完全相同:

unsigned int array[10] = { 0 };

...

if (!(std::cin >> array[i])
{
    throw i;
}
catch (int current_index)
{
    std::cout << "The input for number " << current_index + 1 << " was incorrect.\n";
    std::cout << "Please input only non-negative integers.\n";

    // First clear the stream status
    std::cin.clear();

    // Then skip the bad input
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    // Make sure the index isn't increased
    --i;
}

答案 1 :(得分:0)

在代码中使用以下行时,不要忘记包含限制标头文件:

std :: cin.ignore(std :: numeric_limits :: max(),'\ n');

因为在此头文件中定义了numeric_limits模板!