Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Printf()和Scanf()的C分段错误_C_Segmentation Fault - Fatal编程技术网

Printf()和Scanf()的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

我是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;
}

这些行中的什么导致了分段错误,我可以做些什么来避免它?

您可能对这种递归有问题:

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在评论中所说的那样。