终止在'std :: out_of_range'的实例之后调用what():basic_string :: compare c ++

时间:2016-08-02 07:35:25

标签: c++ arrays string loops compare

当我运行这个程序时,循环执行它想要做的事情,但它也会以某种不寻常的方式出于某种原因终止程序。这有什么不对?

这是它打开的数据文件:

Peter Y Y N Y Y N

Sarah Y Y Y Y Y Y

Bongi Y Y Y N N N

Diane Y N Y N Y Y

Betty N Y Y Y Y N

代码:

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstring>

using namespace std;

int main()
{
    ifstream in_stream;
    in_stream.open("answers.dat");
    if (in_stream.fail())
    {
        cout<<"Input file opening failed"<<endl;
        exit(1);
    }
    string line;
    int q1,q2,q3,q4,q5,q6;
    int prize_money;

    int loop=0;
    string array[20];
    while (!in_stream.eof())
    {
        getline(in_stream,line);
        array[loop]=line;

        if ((line.compare(10,1,"Y")==0)&&(line.compare(14,1,"Y")==0))
        {
            if (line.compare(6,1,"Y")==0)
            {
                q1=1000;
            }
            else
            {
                q1=0;
            }
            if (line.compare(8,1,"Y")==0)
            {
                q2=2000;
            }
            else
            {
                q2=0;
            }
            if (line.compare(10,1,"Y")==0)
            {
                q3=3000;
            }
            else
            {
                q3=0;
            }
            if (line.compare(12,1,"Y")==0)
            {
                q4=4000;
            }
            else
            {
                q4=0;
            }
            if (line.compare(14,1,"Y")==0)
            {
                q5=5000;
            }
            else
            {
                q5=0;
            }
            if (line.compare(16,1,"Y")==0)
            {
                q6=6000;
            }
            else
            {
                q6=0;
            }

            prize_money=q1+q2+q3+q4+q5+q6;
            cout<<line.substr(0,5)<<" R"<<prize_money<<endl;
        }

        loop++;
    }

    cout<<"Test to see if program goes beyond the loop"<<endl;

    in_stream.close();
    return 0;
}

当我运行程序时,它会正确显示获胜者和金额,但会出现一个窗口对话框,收集更多信息并想要关闭程序。一旦我关闭它,屏幕上显示的消息是:

  

在'std :: out_of_range'的实例后调用terminate():basic_string :: compare这个程序已经请求Runtime以一种不寻常的方式终止。有关更多信息,请联系应用程序支持团队

2 个答案:

答案 0 :(得分:1)

如果它读取的最后一行为空,并且您尝试读取该行的字符10,则它将失败。在测试其中的字符之前,您应该检查行的长度。

此外,无论谁指示你使用std::istream::eof作为循环控制是如何做到这一点,你可以告诉他们除了最薄弱的环境之外他们都是错的,没有一个在你发布的代码中展示。 See this question and answers了解有关原因的更多信息。

最后,你很幸运没有一个名叫“John”,“William”,“Jane”或“Annabelle”的人都记录了数据。你的算法非常脆弱,依赖于名称的长度来保持严格的常数,不超过五个字符。

我认为这样的事情会更符合应该做的事情:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstdlib>

int main()
{
    std::ifstream in_stream("answers.dat");
    if (in_stream.fail())
    {
        std::cerr << "Input file opening failed\n";
        exit(EXIT_FAILURE);
    }

    std::string line;
    while (std::getline(in_stream, line))
    {
        std::istringstream iss(line);
        std::string name;
        if (iss >> name)
        {
            static const int prize[] = { 1000, 2000, 3000, 4000, 5000, 6000 };
            static const size_t n_prizes = sizeof prize / sizeof *prize;

            int prize_money = 0;
            std::string yesno;
            for (size_t i=0; i<n_prizes && iss >> yesno; ++i)
            {
                if (yesno == "Y")
                    prize_money += prize[i];
            }

            std::cout << name << " R" << prize_money << '\n';
        }
    }

    return EXIT_SUCCESS;
}

无论如何都是这样的。

答案 1 :(得分:0)

#include<iostream
#include<fstream>
#include<cstdlib>
#include<cstring>
#include<iomanip>
using namespace std;

int main()
   {ifstream in_stream;
 in_stream.open("answers.dat");
if (in_stream.fail())
 {cout<<"Input file opening failed"<<endl;
 exit(1);}
  string line;
 int q1,q2,q3,q4,q5,q6;
  int prize_money;


 int loop=0;
 string array[18];
 while (getline(in_stream,line))

 {array[loop]=line;

  if ((line.compare(10,1,"Y")==0)&&(line.compare(14,1,"Y")==0))
{ if (line.compare(6,1,"Y")==0)
{q1=1000;}
else {q1=0;}
if (line.compare(8,1,"Y")==0)
{q2=2000;}
else {q2=0;}
if (line.compare(10,1,"Y")==0)
{q3=3000;}
else {q3=0;}
if (line.compare(12,1,"Y")==0)
{q4=4000;}
else {q4=0;}
if (line.compare(14,1,"Y")==0)
{q5=5000;}
else {q5=0;}
if (line.compare(16,1,"Y")==0)
{q6=6000;}
else {q6=0;}

prize_money=q1+q2+q3+q4+q5+q6;
    cout<<line.substr(0,5)<<" R"<<prize_money<<endl;
}

loop++;}

cout<<"Test to see if program goes beyond the loop"<<endl;//indeed it does

in_stream.close();
return 0;
}