如何在不知道C语言大小的情况下创建数组

问题描述 投票:1回答:5

假设我必须输入一个数组,但我不知道tha数组的大小。如果我知道该数组的大小,我可以这样做

for(i=0;i<n;i++)
  scanf("%d",&arr[i]);

如果我知道n的值,可以这样做。如果我不知道n的值怎么办?我们如何输入数组?

c arrays size
5个回答
0
投票

我很想知道您是否正在使用用户界面,在这里您可以将数组大小作为输入,然后像对待事先知道数组大小一样正常进行。

一些示例代码供您遵循:-


    int reqArraySize;
    printf("Enter the array size: ");
    scanf("%d", &reqArraySize);


此后,您可以继续使用此getget输入数组大小:


    for(i=0;i<reqArraySize;i++)
      scanf("%d",&arr[i]);

希望这对您有所帮助。

干杯。


0
投票

如果您不知道run-timecompile-time处数组的大小,则应使用linked lists,或按照Jean-Claude在其评论中提到的,声明fixed-size array使用dynamic memory allocationmalloc()之类的calloc()函数,并在需要时使用realloc()数组的大小。


0
投票

您可以按照this question的答案来创建动态数组。它使用的结构包含数组,最大大小和已用大小。如果达到最大大小,将重新分配阵列,并增加最大大小。


0
投票

这里是显示一种管理动态数组的方法的示例。

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
    /*  To manage an array of varying size, we keep a pointer to the size of
        the array and the number of elements in the array.

        The pointer is initially null, and there are no elements in the array.
    */
    int *Numbers = NULL;
    size_t NumberOfAllocatedElements = 0;

    /*  We get numbers one by one, using TemporaryNumber to hold them.  As long
        as scanf reports it was able to read and assign 1 item, we continue
        adding the number to the array.
    */
    int TemporaryNumber;
    while (1 == scanf("%d", &TemporaryNumber))
    {
        /*  To grow the array, increase the number of allocated elements and
            use realloc to request more space.
        */
        int *NewNumbers =
            realloc(Numbers, ++NumberOfAllocatedElements * sizeof *NewNumbers);

        /*  If realloc fails, we report an error and exit.  A more
            sophisticated program could do something else in this case.
        */
        if (!NewNumbers)
        {
            fprintf(stderr, "Error, unable to allocate memory.\n");
            exit(EXIT_FAILURE);
        }

        //  Update our pointer with the new address.
        Numbers = NewNumbers;

        //  Record the new element in the array.
        Numbers[NumberOfAllocatedElements - 1] = TemporaryNumber;
    }

    //  Show the contents of the array.
    for (size_t i = 0; i < NumberOfAllocatedElements; ++i)
        printf("Number %zu is %d.\n", i, Numbers[i]);

    //  Release the memory.
    free(Numbers);
}

这很大程度上是一个初学者的例子。一种改进是一次分配大量内存,而不是每次仅分配一个元素。在这种情况下,程序需要跟踪有关数组的两个数字:分配的空间量和当前在其中使用的元素数。

也有多种选择。


0
投票

这里是一个示例,说明了realloc的用法。请注意,在这里,为了限制重新分配的数量,新大小始终为2的幂。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    int *a, i, j, n, k;
    char input[10];

    /* Start small */
    n = 1;
    a = malloc(n * sizeof(int));

    /* Read an integer until the user types 'end' */        
    for (i = 0; ; i++) {
        fgets(input, 10, stdin);
        input[strcspn(input, "\r\n")] = 0;

        if (!strcmp(input, "end")) {
            break;
        }

        if (!sscanf(input, "%d", &k)) {
            printf("Input error\n");
        } else
            /* Reallocate if the array is full */
            if (i >= n) {
                n *= 2;
                a = realloc(a, n * sizeof(int));
                printf("New size: %d\n", n);
            }

        a[i] = k;
    }

    /* Final reallocation to match the exact size */
    a = realloc(a, i);

    /* Do something with the array */

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

    free(a);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.