未指定函数的返回

时间:2013-07-29 03:51:30

标签: c cs50

我一直在通过各种渠道教自己C.我发现的一个练习是过去一年的cs50问题集({{3>},标题为不良信用。基本上,我已经解决了这个问题,但意识到我正在执行两次相同的步骤,也许可以在函数中包含该步骤以便重用。

我的问题是我不确定如何定义返回尚未指定的数组。或者,就此而言,如果这是一个好主意。我认为重用代码将是一件好事,如果我能使它工作,但我无法弄清楚如何这样做。

问题,如下面的代码所示,取一个长数字,将每个数字分开,然后执行一些数学计算以进行校验和。这将在下面的代码中返回到step1do/while循环正在这里进行繁重的工作,我想做的是对step1中的元素执行相同的操作,并将其返回step2或其他任何变量

long long num = 378282246310005;
int step1[10];
int step2[10];

do {
    int i = 0; 
    step1[i] = num % 10; // this returns to one array
    num /= 10;
    i++;
   } while (num != 0);

我意识到这对于这个问题并不是那么重要。我刚刚决定,如果可能的话,知道怎么做会很好。

2 个答案:

答案 0 :(得分:2)

我会带你完成这些步骤。这是你的代码:

do {
    int i = 0; 
    step1[i] = num % 10;
    num /= 10;
    i++;
} while (num != 0);

首先是错误。 i变量应该在循环外初始化并声明,否则每次循环都会i == 0

int i = 0; 
do {
    step1[i] = num % 10;
    num /= 10;
    i++;
} while (num != 0);

这应该被认为是for循环的扩展版本,所以:

for (int i = 0; num != 0; i++, num /= 10)
    step1[i] = num % 10;
// note: different for case num == 0

然后,如果你想把它变成一个函数,

void get_digits(int digits[], long long num) {
    for (int i = 0; num != 0; i++, num /= 10)
        digits[i] = num % 10;
}

简而言之,当您将数组传递给C中的函数时,数组不会被复制,因此您可以更改函数内部的数组并查看函数外部的更改。 (长版本:当数组是函数参数时,它们会衰减为指针。)

最后注意:数组中需要19个元素,而不是10.所以:

long long num = 378282246310005;
int step1[19];
get_digits(step1, num);

答案 1 :(得分:1)

您可以通过引用传递数组,如下所示:

//Number to checksum is num
//Array to store checksum is arr
//Maximal length of arr is n
void checksum(long long num, int arr[], int n){
  int i = 0; 
  do {
    arr[i] = num % 10; // this returns to one array
    num /= 10;
    i++;
    if(i==n) return; //break before we overflow array
  } while (num != 0);
}

请注意,您的代码可能不安全,因为您可能最终写入数组的一部分,超出了为其分配的内存。也就是说,您定义int step1[10]但最终可能会写入step[11]

另外,你将int i=0卡在了循环中。我以为你想在外面。