我收到一条错误消息说浮点异常(核心已转储),如果我初始化 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";
}
}
最佳答案
cin>>t;
不读取换行符。所以当你调用cin.getline(a, 101);
时,它会直接返回一个空字符串。
这会导致 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";
}
}
关于c++ - 使用 cin 时的浮点异常(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741539/