我是一个完整的初学者。
我有一个将int
转换为array
的函数。
#include <math.h>
#include <stdio.h>
int *convertIntArray(int number) {
int n = log10(number) + 1;
int i;
int *numberArray = calloc(n, sizeof(int));
for (i = 0; i < n; ++i, number /= 10) {
numberArray[i] = number % 10;
}
return numberArray;
}
我想在sample
函数中初始化一个名为main
的数组,方法是将一个整数传递给convertIntArray
函数。我的伪代码如下:
int main(int argc, char *argv[]) {
int sample = convertIntArray(150);
// rest of main function
但是显然这是行不通的。正确的方法是什么?
答案 0 :(得分:0)
该数组由converIntArray
函数分配,并返回指向其第一个元素的指针。如果您使用适当的类型定义array
,则可以将此指向main
的指针存储在array
中:
int main(int argc, char *argv[]) {
int *sample = convertIntArray(150);
// rest of main function
但是请注意,您无法从指针和值中分辨出array
所指向的数组的大小。您应该返回始终分配最大大小(即10 int
),或者以其他方式返回大小,例如作为数组的第一个元素,然后再分配一个额外的元素。
答案 1 :(得分:0)
代码中要注意的第一件事是,您没有包括函数log10()
的原型,我想应该在<math.h>
中。或者您已经完成了,但是没有在代码段中显示它。这是StackOverflow中的错误发布,因为这使我们陷入了决定是否犯错的困境(不包括错误,这会给您不确定的行为,因此,请编辑您的问题,包括minimal, complete and verifiable example。
万一我不得不编写你的函数,我不应该使用log10()
,因为它是一个浮点函数,并且在计算中出现舍入错误的情况下,你可以选择错误的数字位数进行分配。无论如何,通过将您的界面更改为此,我将尝试使用尽可能少的支持功能:
unsigned *number2digits(
unsigned *array_to_work_in, /* the array is provided to the function */
size_t array_size, /* the size of the array, in number of elements */
unsigned source_number, /* the number to be converted */
unsigned base); /* the base to use for conversion */
这种方法不会强迫您仅包含log10()
函数的数学库,也不会利用动态分配程序例程malloc()
和calloc()
,并且如果函数不调用更多外部/库函数,则编译器会对其进行更好的优化。如果您想在已分配的数组上使用该函数(请参见下文),则不必重写它。另外,将数字基数作为参数传递是一件好事,因此您不必局限于仅以10为基数的数字。
另一个错误是您正在返回int *
(指向int
的指针),并且将该值分配给类型为int
的变量(这是应该给您的错误编译器错误)。
有效(且完整且可验证)的示例代码应为:
#include <stdio.h>
#include <stdlib.h>
unsigned *number2digits(
unsigned *array_to_work_in, /* the array is provided to the function */
size_t array_size, /* the size of the array, in number of elements */
unsigned source_number, /* the number to be converted */
unsigned base) /* the base to use for conversion */
{
size_t i;
for (i = 0; i < array_size; i++) {
array_to_work_in[i] = source_number % base;
source_number /= base;
}
/* if, at this point, source_number != 0, you made an error
* on estimating array size, as the number doesn't fit in
* array_size digits. In case of error, we return NULL to
* indicate the error. */
return source_number == 0 ? array_to_work_in : NULL;
}
#define NUMBER 150000
#define N 10
#define BASE 38
int main()
{
unsigned my_array[N]; /* 10 digits for a base 38 is enough for a 32 bit integer */
unsigned *r = number2digits(my_array, N, NUMBER, BASE);
if (!r) {
fprintf(stderr, "Error, number %u does not fit in %u base %u digits\n",
NUMBER, N, BASE);
exit(EXIT_FAILURE);
}
printf("%u =/base %u/=>", NUMBER, BASE);
int i; /* we use int here as size_t is unsigned and we could
* not detect the loop exit condition */
for (i = N-1; i >= 0; i--) {
printf(" %u", r[i]);
}
printf("\n");
exit(EXIT_SUCCESS);
}
它显示:
$ pru
150000 =/base 38/=> 0 0 0 0 0 0 2 27 33 14
$ _