[英]C Segmentation Fault With Printf() and Scanf()
我是C语言的新手,但遇到了我无法理解的分段错误。 我有以下程序,该程序尝试计算严格为正数的因数:
#include <stdio.h>
#include <math.h>
int numberOfFactors (int number, int factor) {
if (number % factor == 0) {
number = number/factor;
return numberOfFactors(number, factor) + 1;
} else {
return 0;
}
}
int check (int x) {
if (x>0) {
return 1;
} else {
return 0;
}
}
int main(void) {
int number;
printf("Please enter a positive integer n such that n >= 1: ");
scanf("%d", &number);
if (check(number)){
int i;
for (i=1; i<=number; i++) {
int factors;
factors = numberOfFactors(number, i);
printf("%d^%d ", i, factors);
}
}
return 0;
}
在main()中的这些行之后输入整数并按ENTER键后,立即发生分段错误:
printf("Please enter a positive integer n such that n >= 1: ");
scanf("%d", &number);
这些行中的什么导致了分段错误,我该怎么做才能避免呢?
如果您尝试分解因子一,则递归不会停止。
只是让因子永远不会是1:
for (i=2; i<=number; i++) {
int factors;
factors = numberOfFactors(number, i);
printf("%d^%d ", i, factors);
}
我应该说为什么会出现段错误:这是因为每个函数调用都会将当前程序计数器(程序中您当前站立的位置)和函数参数推入堆栈(也称为调用堆栈),其中堆栈是使用的相对较小的内存块函数调用和局部变量。
因此,如果您用力推动堆栈,堆栈将掉落。 游戏结束,也就是段错误;)
您可能对此递归有问题:
int numberOfFactors (int number, int factor) {
if (number % factor == 0) {
number = number/factor;
return numberOfFactors(number, factor) + 1;
} else {
return 0;
}
}
将您的numberOfFactors更改为以下内容:
int numberOfFactors (int number)
{
int i=1;
int ret=0;
for(;i<=number;i++) {
if (number%i == 0) {
ret++;
}
}
return ret;
}
然后,更改此部分:
if (check(number)){
int i;
for (i=1; i<=number; i++) {
int factors;
factors = numberOfFactors(number, i);
printf("%d^%d ", i, factors);
}
}
像这样简单一些:
if (check(number)){
factors = numberOfFactors(number);
printf("%d^%d ", number, factors);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.