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

Floating point exception (core dumped) when using 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";
    }
}

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

浮点异常是当您尝试用浮点数做一些不可能的事情时发生的错误,例如除以零。它正在发生。

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

你可以在cin >> t之后添加这一行:

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

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

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

cin>>t; 不读换行符。因此,当您调用 cin.getline(a, 101); 时,它会直接 return 并带有一个空字符串。

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

处崩溃

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

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

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

#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";
    }
}