使用函数在C中初始化数组变量

时间:2018-09-24 19:46:28

标签: c

我是一个完整的初学者。

我有一个将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

但是显然这是行不通的。正确的方法是什么?

2 个答案:

答案 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
$ _