用户读取未定义大小的数组的数字

时间:2013-12-05 16:39:06

标签: c arrays

我有这个程序:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i;
    int myArray[5];

    printf("Enter some numbers for the array.\n\n");

    for( i = 0; i < 5; i++ )
    {
    scanf("%d", &myArray[i]);
    }

    printf("\nPrinting array...\n\n");

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

}

我想修改我的程序以允许用户输入任意数量的数字,当它们完成时,他们可以输入“-1”,然后退出scanf循环并继续在程序中打印数组。问题是我不明白如何在没有大小的情况下声明一个数组。我知道我可以使用sizeof(myArray / myArray[0]);来查找数组中的元素数量,但是编译器希望我总是输入一些我不知道的初始大小。

3 个答案:

答案 0 :(得分:1)

您可以为阵列使用动态内存。您可以使用malloc

分配动态数组

您可以使用realloc

调整数组大小

答案 1 :(得分:1)

有两种解决方案:

您可以先询问用户他们计划输入多少个号码,然后malloc一个足够大的数组。

要按照您希望的方式实现解决方案,您需要随着时间的推移动态调整阵列大小。例如

int *array, num_entries = 0, new_entry, array_size_multiple = 10;
array = malloc(array_size_multiple * sizeof *array);
while (1) {
    scanf("%d", &new_entry);
    if (entry == -1) break; // stop when the user enters -1
    if (num_entries % array_size_multiple == 0
        && num_entries > 0) // to protect base case
    { // need to allocate more space
        array = realloc(array, (num_entries / array_size_multiple + 1)
                                * sizeof *array);
    }
    array[num_entries] = new_entry;
    ++num_entries;
}

答案 2 :(得分:1)

最简单的方法是向用户询问他想要输入的许多元素。然后声明一个大小的数组并继续。而不是5使用用户定义的大小。

如果您要输入大量数据,也可以调整数组的大小,这很昂贵。 但在我看来,这些并不是最好的解决方案。用户可能会犯错。 更好的解决方案是使用简单的LinkedList结构。

你应该有一个while循环,当用户输入'EOF'或'-1'或者你认为适合标记输入的结尾时停止。 然后,对于每个新输入,您分配新节点并将其放在列表的末尾。

如果以后仍需要使用数组,则可以分配大小与LinkedList相同的新数组并填充它。