目前,我正在尝试构建一个程序,以打印所有armstrongnumbers到特定数字。尝试运行此程序时出现一些奇怪的错误。它说bufferoverflow。
导致它的部分似乎在main()中。谢谢你的帮助。
#include <stdio.h>
#define MAXIMUM 1000000
int ipow(int x, int power){
int z,t;
t = 0;
z = x;
for (t = 0; t < (power - 1); t++) {
z = z * x; }
return z;
}
int getLength(int x) {
int a;
a = 1;
for (a=1;1;a++) { if (x < ipow(10,a) && x >= ipow(10,(a-1))) return a; }
}
int getExpSum(int x) {
int summe,r,s,t;
int digit[8]={0,0,0,0,0,0,0,0};
summe=0;
s = getLength(x);
t = x;
r = 1;
for (s=getLength(x);s!=0;s--){
digit[s] = t % 10;
t = t / 10;
}
for(r=1;r<(getLength(x)+1);r++)
{
summe = summe + ipow(digit[r],getLength(x));
}
return summe;
}
int Armstrong (int x) {
if (getExpSum(x)==x) {
printf("%d ist eine Armstrongzahl\n", x);
return 1;
}
return 0;
}
void main(){
int z;
z = 0;
for (z=0;z<MAXIMUM;z++){
Armstrong(z+1);
}
}
最佳答案
您的“ getLength”函数存在问题(实际上是ipow)
传递getLength(1),结果为13,因为
ipow(10,1)和ipow(10,0)返回10,因此“ getLength”条件失败,它将继续进行下一次迭代并继续..直到ipow由于整数大小而返回的负数为10 ^ 13。
在getExpSum中,数组数字的大小为8,它尝试访问其第13个元素。因此它崩溃
将条件添加到ipow函数
int ipow(int x, int power){
int z,t;
t = 0;
z = x;
if (power == 0) //<-----add this condition to your code
return 1;
for (t = 0; t < (power - 1); t++) {
z = z * x; }
return z;
}
添加此条件后,我得到正确的结果。
1 ist eine Armstrongzahl
2 ist eine Armstrongzahl
3 ist eine Armstrongzahl
4 ist eine Armstrongzahl
5 ist eine Armstrongzahl
6 ist eine Armstrongzahl
7 ist eine Armstrongzahl
8 ist eine Armstrongzahl
9 ist eine Armstrongzahl
153 ist eine Armstrongzahl
370 ist eine Armstrongzahl
371 ist eine Armstrongzahl
407 ist eine Armstrongzahl
1634 ist eine Armstrongzahl
8208 ist eine Armstrongzahl
9474 ist eine Armstrongzahl
54748 ist eine Armstrongzahl
92727 ist eine Armstrongzahl
93084 ist eine Armstrongzahl
548834 ist eine Armstrongzahl
顺便说一句,可以改善解决方案。
关于c - 阿姆斯壮数字缓冲区溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13253816/