使用 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";
}
}
我收到一条错误消息说浮点异常(核心已转储),如果我初始化 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";
}
}