我一直在通过各种渠道教自己C.我发现的一个练习是过去一年的cs50问题集({{3>},标题为不良信用。基本上,我已经解决了这个问题,但意识到我正在执行两次相同的步骤,也许可以在函数中包含该步骤以便重用。
我的问题是我不确定如何定义返回尚未指定的数组。或者,就此而言,如果这是一个好主意。我认为重用代码将是一件好事,如果我能使它工作,但我无法弄清楚如何这样做。
问题,如下面的代码所示,取一个长数字,将每个数字分开,然后执行一些数学计算以进行校验和。这将在下面的代码中返回到step1
。 do/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);
我意识到这对于这个问题并不是那么重要。我刚刚决定,如果可能的话,知道怎么做会很好。
答案 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
卡在了循环中。我以为你想在外面。