c / c ++ | int * excepted,int given(返回指针??)

时间:2017-05-11 07:27:50

标签: c++ c arrays function-calls

所以我正在制作一个程序来找到最大可能的减法。如果n是,f.e9284,用9284的数字可以产生的最小数字是2489,最大的数字是9842.函数max_substraction返回9842 - 2489作为输出。

问题是每当我运行程序并输入一个数字时,程序就会崩溃。我确实尝试调试,我被告知函数“to_digits”除了int *但是给出的int非常奇怪。我不是回指针吗? ...

#include <stdio.h>

int valid(int);
int length(int);
int to_digits(int);
int to_num(int *, int);
void sort_digits(int *, int);
int max_substraction(int *, int);

int i,j;

int main()
{
    int num;
    scanf("%d", &num);
    if(!valid(num))
    {
        printf("Invalid!\n");
    }
    else {

        printf("%d", max_substraction(to_digits(num), length(num)));
    }
    return 0;
}

int length(int num){

    int cpy_of_num = num, len = 0;
    do {
        cpy_of_num /= 10;
        len++;
    } while(cpy_of_num != 0);

    return len;
}

int valid(int num){
    int len = length(num);
    if(len<2 || len>9){
        return 0;
    }
    return 1;
}
int to_digits(int num){
    int len = length(num), cpy_of_num = num;
    int digits[len];
    for(i=len-1; i>=0; i--){
        digits[i] = cpy_of_num % 10;
        cpy_of_num /= 10;
    }
    return *digits;
}
int to_num(int *digits, int len){
    int new_num = 0, mult = 1;
    for(i=len-1; i>=0; i--){
        new_num += digits[i]*mult;
        mult *= 10;
    }
    return new_num;
}
void sort_digits(int *digits, int len){
    for(i=1;i<len;i++){
        for(j=0;j<len-1;j++){
            if(digits[j] > digits[j+1]){
                int temp = digits[j];
                digits[j] = digits[j+1];
                digits[j+1] = temp;
            }
        }
    }
}
int max_substraction(int *digits, int len){
    sort_digits(digits, len);
    int max_num_digits[10], min_num_digits[10];
    for(i=0; i<len; i++){
        min_num_digits[i] = digits[i];
        max_num_digits[i] = digits[len-i-1];
    }
    int min_num = to_num(min_num_digits, len);
    int max_num = to_num(max_num_digits, len);

    return max_num - min_num;
}

2 个答案:

答案 0 :(得分:0)

问题在于函数调用

  max_substraction(to_digits(num), length(num))

根据签名,

int max_substraction(int *digits, int len)

第一个参数应为int *,但to_digits()会返回int !!

然后,返回语句如

  return *digits;

返回int值,而不是指针。

也就是说,即使您尝试过,当前的形式,digits数组也无法从to_digits()返回,因为它是函数的本地数组。如果要返回数组,则需要具有静态存储空间。现在,根据定义,VLA不能具有静态存储,您可能希望使用内存分配器功能,如malloc()和系列。

答案 1 :(得分:0)

你的函数to_digits有一个声明为int的返回类型,而它实际上试图返回一个int *。 在它的当前形式中,当函数结束时,数组将不再存在,因此为了在函数to_digits之外使用数组,需要不同的内存分配方式。