使用cin时浮点异常(核心转储)

时间:2015-09-23 13:52:39

标签: c++ cin

我收到错误说浮点异常(核心转储),如果我初始化t=1而不是cin>>t,它运行正常。

我的源代码是

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int t,z,i,l,w;

    cin>>t;
    char a[101];

    for(z=0;z<t;z++)
    {
        cin.getline(a,101);
        l=strlen(a);
        w=0;
        for(i=0;i<l;i++)
        {
            w=w+(int)a[i];
        }
        w=w/l;

        if(w%2==1)
        {
            for(i=l-1;i>=0;i--)
            {
                cout<<a[i];
            }
        }
        else
        {
            for(i=0;i<l;i++)
            {
                cout<<a[i];
            }
        } 
        cout<<"\n";
    }
}

3 个答案:

答案 0 :(得分:2)

您可以在cin >> t之后添加此行:

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

忽略仍在输入流中的\n字符。

您还需要#include <limits>进行编译。

答案 1 :(得分:2)

cin>>t;未读取换行符。因此,当您调用cin.getline(a, 101);时,它将直接返回一个空字符串。

这会导致l设置为0,并且由于不允许除以零,会导致您的程序在w = w /l;

崩溃

您可以将cin>>t;替换为cin >> t; cin.clear(); cin.ignore();来解决部分问题。这将使cin.getline(a, 101)按预期工作。

修复的下一部分是避免读取空数据本身(例如,只需在下一行按Enter键)。根据程序的行为方式,您可以重试读取,直到设置有效字符串,或者只是跳过执行空字符串。我在下面的调整版中使用了跳过示例。

我还会使用更多括号来说明在(或至少使用可读的缩进)时会发生什么。

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int t, z, i, l, w;
    char a[101];

    cin >> t; cin.clear(); cin.ignore(); //Remove leftovers from cin.

    for (z = 0; z < t; z++)
    {
        cin.getline(a, 101);

        l = strlen(a);
        if (l == 0) //Skip empty words
        {
            continue;
        }

        w = 0;
        for (i = 0; i < l; i++) 
        {
            w = w + (int)a[i];
        }

        w = w / l;

        if (w % 2 == 1)
        {
            for (i = l - 1; i >= 0; i--)
            {
                cout << a[i];
            }
        }
        else
        {
            for (i = 0; i < l; i++)
            {
                cout << a[i];
            }
        }
        cout << "\n";
    }
}

答案 2 :(得分:1)

问题是for循环的第一行中的cin.getline读取一个零长度的字符串,并在行w=w/l中除以它的长度(= 0)。

浮点异常是当您尝试使用浮点数执行某些不可能的操作时发生的错误,例如除以零。而这里正在发生。

尝试在for循环之前执行cin.ignore,以便将换行符从cin的缓冲区中取出。