我是C语言的新手,当在控制台中传递此错误时,我不知道如何摆脱此错误。我尝试着看其他问题,但实际上我不知道要寻找什么。我尝试查看argv的运行,但没有发现任何突出的内容。

./calculate factorial 4

Segmentation fault (core dumped)


程序:

#include "calculate.h"

int main(int argc, char * argv[])
{
    if(strcmp(argv[1], "factorial") == 0){
        int result = factorial(argc, argv);
        printf("%d\n", result);
    }
    else if(strcmp(argv[1], "combination") == 0){
        int result = combination(argc, argv);
        printf("%d\n", result);
    }
    else if(strcmp(argv[1], "permutation") == 0){
        int result = permutation(argc, argv);
        printf("%d\n", result);
    }
    else if(strcmp(argv[1], "pythagorean") == 0){
        int result = pythagorean(argc, argv);
        printf("%d\n", result);
    }
    else{
    printf("You did not use a valid input!\n");
    }

    printf("Assignment1-4");
    return 0;
}

int factorial(int argc, char * argv[]){
    int i = atoi(argv[3]);
    if ( i == 0 ){
        return 1;
    }
    return(i * factorial((i - 1),argv));
}

int combination(int argc, char * argv[]){
    int n = atoi(argv[3]);
    int i = atoi(argv[4]);
    return(factorial(n,argv) / (factorial(i,argv) * factorial((n- i), argv)));
}

int permutation(int argc, char * argv[]){
    int n = atoi(argv[3]);
    int i = atoi(argv[4]);
    return(factorial(n,argv) / factorial((n-i), argv));
}

int pythagorean(int argc, char * argv[]){
    int c = 0;
    int a = atoi(argv[3]);
    int b = atoi(argv[4]);
    c = (a*a) + (b*b);
    c = sqrt(c);
    return c;
}


我只是找不到问题,谢谢。

最佳答案

在函数factorial()中,将argv [3]分配给i。但是在使用./calculate factorial 4运行程序时,没有argv [3]条目。这意味着argc只有3(argv数组的长度是3)。您正在访问argv []数组超出其范围。使用i = atoi(argv[2])获取预期值。

同样在递归调用中,我总是用argv []值初始化。因此它将永远不会达到0并导致无限循环。

编写如下的factorial()并以factorial(atoi(argv[2]))的形式从main()调用

int factorial(int i){
if ( i == 0 ){
    return 1;
}
return(i * factorial((i - 1));
}

关于c - 程序中的段错误(核心转储)错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50849934/

10-11 23:08
查看更多