【问题标题】:Unspecified return from a function未指定的函数返回
【发布时间】:2013-07-29 03:51:29
【问题描述】:

我一直在通过各种渠道自学 C。我发现的练习之一是去年的 cs50 问题集(found here 在标题 Bad Credit 下)。从本质上讲,我已经解决了这个问题,但我意识到我正在执行相同的步骤两次,也许可以将该步骤包装在一个函数中以供重用。

我的问题是我不确定如何定义返回到尚未指定的数组。或者,就此而言,如果这是一个好主意。我认为如果我可以让它工作,重用代码将是一件好事,但我不知道该怎么做。

如下代码所示,问题是取一个长数字,将每个单独的数字分开,并执行一些数学运算来进行校验和。这在下面的代码中返回给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);

我意识到这对这个问题来说没什么大不了的。我刚刚决定,如果可能的话,最好知道该怎么做。

【问题讨论】:

  • 将指向数组的指针传递给函数。
  • 我很确定 int i = 0; 需要在循环之外。
  • @Casey: 或者你可以改成static int i = 0;???
  • @WedaPashi:引入全局状态?为什么?
  • @GManNickG:无论如何,他需要让i 成为全球int 先生

标签: c cs50


【解决方案1】:

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

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);

【讨论】:

  • 我相信我明白了。根据您的示例,您可以在函数内指定数组:get_digits(step2, step1[n])
  • 我们可以在这里将i 声明为static int 吗?
  • 在大多数情况下,数组衰减为指针;它们用作函数参数并没有什么特别之处。 (数组 parameter 声明被调整为指针,但这是一个不同的规则。)
  • @KeithThompson:我指的是函数参数列表中的数组声明符。这有点切题,而且“衰变”无论如何都是一个非正式的术语。
  • 请注意,如果需要处理零输入,for 循环不等同于do … while 循环。 do … while 循环在数组中插入一个零; for 循环没有。
【解决方案2】:

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

//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 卡在循环中。我以为你想要它在外面。

【讨论】:

    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 2021-03-02
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多