Printf()和Scanf()的C分段错误
我是C语言的新手,我遇到了一个无法理解的分割错误。我有以下程序,它试图计算一个严格正数的因子数:Printf()和Scanf()的C分段错误,c,segmentation-fault,C,Segmentation Fault,我是C语言的新手,我遇到了一个无法理解的分割错误。我有以下程序,它试图计算一个严格正数的因子数: #include <stdio.h> #include <math.h> int numberOfFactors (int number, int factor) { if (number % factor == 0) { number = number/factor; return numberOfFactors(number, f
#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;
}
这些行中的什么导致了分段错误,我可以做些什么来避免它?您可能对这种递归有问题:
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;
}
您可能对此递归有问题:
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;
}
如果你试图除掉因子1,你的递归就不会停止 让因子永远不要为1:
for (i=2; i<=number; i++) {
int factors;
factors = numberOfFactors(number, i);
printf("%d^%d ", i, factors);
}
for(i=2;i如果您试图除掉因子1,您的递归不会停止
让因子永远不要为1:
for (i=2; i<=number; i++) {
int factors;
factors = numberOfFactors(number, i);
printf("%d^%d ", i, factors);
}
用于(i=2;i您是否尝试过在调试器下运行?它可能会在导致故障的那一行停止。不,我实际上只是在TextWrangler中键入此内容,然后将其传送到我的学校Linux环境。您是否尝试过在调试器下运行?它可能会在导致故障的那一行停止。不,我实际上只是在键入这是在TextWrangler中创建的,然后将其传送到我的学校Linux环境中。但我认为它没有到达那里,因为我在那里抛出了一些printf语句进行检查。事实上,我在main中的scanf之后立即抛出了一个printf,它甚至没有走到那么远。@canton这可能会非常误导。stdout
是由def缓存的行ault.因此,程序可能会在数据仍处于缓冲状态时崩溃。最好的选择是调试器,但如果要使用printf()
请确保以\n
或fflush(stdout)结束字符串;
立即after@canton:正如FatalError在他/她的评论中所说的那样。但我认为它没有到达那里,因为我在那里抛出了一些printf语句进行检查。事实上,我在主扫描之后立即抛出了一个printf,它甚至没有走到那么远。@canton这可能会非常误导。stdout
是行缓冲的默认值。因此,程序可能会在数据仍被缓冲的情况下崩溃。最好的选择是调试器,但如果要使用printf()
,请确保立即以\n
或fflush(stdout);
结束字符串after@canton:正如FatalError在评论中所说的那样。