【问题标题】:How to make use of an array returned by a function? in C language如何利用函数返回的数组?在 C 语言中
【发布时间】:2022-01-05 22:54:26
【问题描述】:

我对这个问题的总体目标是了解如何使用(例如打印)从外部函数返回的数组。我以质数为例。 我是新人,所以要深入解释......如果有不需要的信息或滥用的术语,我很抱歉:)

我定义了一个函数“findprimes”来查找 1 和 x 之间的每个素数。 该函数成功打印一个素数数组。但是,我不知道它是否返回素数数组。而且,如果是这样,我不知道如何在 main() 中使用所述数组。

这是函数'findprimes':

int* findprimes(int x) {

    int i, j, total=0;
    int* numbers = (int*)malloc((x + 1) * sizeof(int));

    /* initialization */
    for (i = 0; i <= x + 1; i++) {
        numbers[i] = 1;
    }

    /* find primes and assign prime=1 */
    for (i = 2; i < sqrt(x); i++) {
        if (numbers[i] == 1) {
            for (j = i * i; j <= x; j = j + 2) {
                if (j % i == 0) {
                    numbers[j] = 0;
                }
            }
        }
    }

    /* count how many primes */
    for (i = 1; i <= x; i++) {
        if (numbers[i] == 1) {
            total++;
        }
    }

    /* put primes into their own array */
    int* primes = (int*)malloc(total * sizeof(int));
    for (i = 1,j=0; i <= x; i++) {
        if (numbers[i] == 1) {
            primes[j] = i;
            j++;
        }
    }

    //I want this part to be in main()
    printf("The prime numbers between 1 and %d are: ", x);
    for (i = 0; i < total; i++) {
        printf("%d ", primes[i]);
    }
    
    return primes;
}

我想在 main 中打印 'primes' 数组,而不是在函数 'findprimes' 本身中。我该怎么做?

int main() {

    int n;

    do {
        printf("Enter a value for X>2: ");
        scanf("%d", &n);
    } while (n <= 2);

    findprimes(n); //This returns 'primes' array

    //I want to print 'primes' array here
}

【问题讨论】:

    标签: arrays c return-value variable-length-array


    【解决方案1】:

    捕获main()中的返回值:

    int *primes = findprimes(n);
    

    并使用数组:

    for (int i = 0; i < some_magic_number; i++)
    {
        printf("%d\n", primes[i]);
    }
    

    记得释放内存:

    free(primes);
    

    其实你还需要在函数中释放numbers。

    需要知道some_magic_number — main() 函数如何知道数组中有多少元素?解决这个问题的一种方法是将指针传递给可以保存素数的函数:

    int *findprimes(int n, int *num_primes)
    

    并在返回之前在函数中使用*num_primes = total;。 您可以使用以下方法调用该函数:

    int some_magic_number;
    int *primes = findprimes(n, &some_magic_number);
    

    您可能会为 main() 中的变量选择一个替代名称,但这说明了我的观点。

    【讨论】:

    • 不相关:numbers in findprimes 也需要在函数返回之前被freeed。
    • @user4581301 — 是的。还有一个问题就是返回了数组但是没有长度,打印起来很复杂(很多)。
    • @JonathanLeffler 我正在尝试执行此操作,但无法正确使用语法...如何编写“findprimes”的 return() 部分?我在函数中添加了int *num_primes 部分并写道:*num_primes = total; return(primes, &amp;*num_primes); 所以它应该返回它们,不是吗?
    • 一个函数只能返回一个值。这就是为什么我建议使用额外的指针参数。或者,您可以创建一个具有长度和指针的结构类型并返回它。
    • 问题是我没有使用正确的语法。我现在了解您的解决方案,这很好,谢谢!然而出现了一个新问题...link
    猜你喜欢
    • 2012-02-02
    • 2021-07-07
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多