c/c++ | int * excepted, int given(返回一个指针??)
c/c++ | int * excepted, int given (returning a pointer??)
所以我正在编写一个程序来找到最大可能的减法。如果n是f.e9284,那么9284的数字可以组成的最小数是2489,最大是9842。函数max_substractionreturns9842-2489作为输出。
问题是,每当我 运行 程序并键入数字时,程序就会崩溃。我确实尝试调试,我被告知函数 "to_digits" 除了 int * 但 int given 这真的很奇怪。我不是返回一个指针吗? ...
#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;
}
问题出在函数调用
max_substraction(to_digits(num), length(num))
根据签名,
int max_substraction(int *digits, int len)
第一个参数应该是 int *
,但是 to_digits()
return 你是 int
!!
然后,像
这样的return语句
return *digits;
return你是一个 int
值,而不是指针。
就是说,即使您尝试过,在当前形式下,digits
数组也不能从 to_digits()
中 return 编辑,因为它是函数的局部变量。如果要 return 数组 ,则需要静态存储。现在,由于根据定义,VLA 不能有静态存储,您可能需要使用内存分配器函数,例如 malloc()
和 family.
你的函数 to_digits 有一个声明为 int 的 return 类型,而它实际上试图 return 一个 int*。
在当前形式下,函数结束时数组将不复存在,因此需要一种不同的内存分配方式才能在函数外部使用数组 to_digits.
所以我正在编写一个程序来找到最大可能的减法。如果n是f.e9284,那么9284的数字可以组成的最小数是2489,最大是9842。函数max_substractionreturns9842-2489作为输出。
问题是,每当我 运行 程序并键入数字时,程序就会崩溃。我确实尝试调试,我被告知函数 "to_digits" 除了 int * 但 int given 这真的很奇怪。我不是返回一个指针吗? ...
#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;
}
问题出在函数调用
max_substraction(to_digits(num), length(num))
根据签名,
int max_substraction(int *digits, int len)
第一个参数应该是 int *
,但是 to_digits()
return 你是 int
!!
然后,像
这样的return语句 return *digits;
return你是一个 int
值,而不是指针。
就是说,即使您尝试过,在当前形式下,digits
数组也不能从 to_digits()
中 return 编辑,因为它是函数的局部变量。如果要 return 数组 ,则需要静态存储。现在,由于根据定义,VLA 不能有静态存储,您可能需要使用内存分配器函数,例如 malloc()
和 family.
你的函数 to_digits 有一个声明为 int 的 return 类型,而它实际上试图 return 一个 int*。 在当前形式下,函数结束时数组将不复存在,因此需要一种不同的内存分配方式才能在函数外部使用数组 to_digits.