无法在c ++中解决浮点异常

时间:2016-01-04 05:02:05

标签: c++

这是我的代码。

#include <iostream>
using namespace std;

typedef struct
{
   int polski;
   int wf;
   int matma;
}oceny;

int funkcja_liczaca(int suma, int ile_liczb, int ktory_przedmiot, oceny &temporary);

int main()
{
   int suma = 0;
   int temp[3];
   int ile_liczb_zostalo_wprowadzonych = 0;
   oceny database;
   string teksty[3] = {"polski: ", "wf: ", "matma: "};
   for (int i=0; i!=3; i++)
   {
      cout << teksty[i] << endl;
      while(temp[i]!=0)
      {
         cin >> temp[i];
         if(cin.good()) //floating point exception here. the code don't even step into this one.
         {
            {
               suma = temp[i] + suma;
               ile_liczb_zostalo_wprowadzonych++;
               if(temp[i]==0){ile_liczb_zostalo_wprowadzonych--;}
            }
         }else cout << "error";
      };
      funkcja_liczaca(suma, ile_liczb_zostalo_wprowadzonych, i, database);
      suma = 0;
      ile_liczb_zostalo_wprowadzonych = 0;
   }
   cout << "output of struct members in main() \n";
   cout << database.polski << endl;
   cout << database.wf << endl;
   cout << database.matma << endl;
   return 0;
}

int funkcja_liczaca(int suma, int ile_liczb, int ktory_przedmiot, oceny &temporary)
{
   if(ktory_przedmiot==0){temporary.polski=suma/ile_liczb;cout << temporary.polski << endl;}
   if(ktory_przedmiot==1){temporary.wf=suma/ile_liczb;cout << temporary.wf << endl;}
   if(ktory_przedmiot==2){temporary.matma=suma/ile_liczb;cout << temporary.matma << endl;}
}

它计算输入数字的算术平均值,直到结束循环的用户输入0。然后,在funkcja_liczaca()中计算thoose数的算术平均值,并将其保存到struct oceny的成员中。 一切正常,但我想实现像&#34; stream&#34;从键盘输入时检查以防止将错误变量输入整数类型变量。 所以输入&#39; into temp [i]导致浮点异常。问题是为什么? cin.good()和cin.fail()不起作用。

1 个答案:

答案 0 :(得分:0)

当您想要处理输入流中的错误时,最好逐行读取输入作为字符串,然后尝试从字符串中提取数据。如果从字符串中提取数据成功,请继续处理数据。否则,尝试阅读下一行文本。这是核心逻辑。

  while ( true )
  {
     cout << teksty[i] << endl;
     std::string line;
     if ( !getline(cin, line) )
     {
        // Problem reading a line of text.
        // Exit.
        exit(EXIT_FAILURE);
     }

     // Construct a istringstream object to extract the data.
     std::istringstream istr(line);
     if ( istr >> temp[i] )
     {
        // Extracting the number was successful.
        // Add any additional checks as necessary.
        // Break out of the while loop.
        break.
     }

     // Bad input. Continue to the next iteration of the loop
     // and read the next line of text.
  }