我正在尝试解决高中问题,并且在尝试调试程序时遇到分段错误。您能告诉我代码有什么问题吗?
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;
ifstream fin;
ofstream fout;
void afisare_cifre(int a[30],int n)
{
int nr=0,cp;
for(int i=0;i<n;i++)
{
cp=a[i];
while(cp!=0)
{
if((cp%10)%2==0)
nr++;
cp/=10;
}
fout<<nr<<" ";
nr=0;
}
fout<<"\n";
}
int main ()
{
fin.open("in.txt", ios::in);
fout.open("out.txt", ios::out);
int n,p,k,a[30],ok=0;
if(fin.bad())
{
cerr<<"Eroare!"<<endl;
exit(1);
}
if(fout.bad())
{
cerr<<"Eroare!"<<endl;
exit(1);
}
fin>>n>>p>>k;
n = std::max(0,std::min(n, 30));
for(int i=0;i<n;i++)
fin>>a[i];
for(int i=0;i<n;i++)
if(a[i] % p == k)
fout<<a[i]<<" ";
fout<<"\n";
afisare_cifre(a,n);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(a[i]==a[j])
ok=1;
if(ok)
fout<<"ELEMENTELE NU SUNT DISTINCTE";
else
fout<<"ELEMENTELE SUNT DISTINCTE";
return 0;
}
我以为这可能是内存问题,但我无法弄清楚。谢谢!
代码的主要错误在于,您在编写代码时假设数组从索引1而不是0开始,并且循环没有适当地将自身限制为a
数组的最高索引(99)。
为了解决第二个问题,您的输入使用了一个变量n
,但是没有什么能阻止任何人输入的完全超出范围的值n
。您可以通过允许输入任何值来停止此操作,但可以限制循环次数:
#include <algorithm>
//...
f_in >> n >> p >> k;
n = std::max(0,std::min(n, 100));
上面的代码确保n至少为0,但不超过100。
接下来,将循环更改为从0开始。我知道其他人可能不同意编写基于1的数组循环是可以的,但是根据我的经验,我还没有看到(新手)编码人员编写尝试基于1的无错误代码的代码。数组访问。通常在代码中的某个地方存在“ by-by-1”错误,并且很难发现这些错误。如果编码器不一致,并且在大型程序的某个地方引入了从0开始的索引,这与程序中其他地方使用的从1开始的索引相冲突,则尤其如此。
因此,例如,代替这样的事情(由于越界访问而无法使用):
for (int i = 1; i <= n; i++)
f_in >> a[i];
做这个:
for (int i = 0; i < n; i++)
f_in >> a[i];
进行这些更改可能会解决您的细分错误。我没有遍历您的所有代码,但是这些都是显而易见的问题。
另外,通过使用调试器或使用cout
显示输入值之前,请确保使用正确的值。您的代码中有这样一行:
if (a[i] % p == k)
如果p
为0,则取模0为未定义。
另一个可能的问题与流有关。您将全局变量作为流,因此您应该尝试以不同的方式对其进行管理,并查看这是否可以缓解您遇到的分段错误问题。
首先这个:
ifstream fin("Atestat.in", ios::in);
ofstream fout("Atestat.out", ios::out);
应该:
ifstream fin;
ofstream fout;
在中main
,在此处打开文件:
f_in.open("Atestat.in", ios::in);
f_out.open("Atestat.out", ios::out);
如果在main()返回时发生分段错误,则这是流关闭的问题(由于调用了流对象的析构函数,因此这是自动的)。这不应该发生,但是如果这不能纠正分段错误,则应该注意一些事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句