【问题标题】:User to read in numbers for an array of undefined size用户读取未定义大小数组的数字
【发布时间】:2013-12-22 17:23:08
【问题描述】:

我有这个程序:

#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]); 来查找数组中元素的数量,但编译器希望我始终输入一些我不知道的初始大小。

【问题讨论】:

  • 听起来您需要使用指针创建一个类似列表的数据结构,以便您可以动态添加任意数量的项目。
  • 尝试使用列表而不是数组,您可以在列表中添加或删除项目。

标签: c arrays


【解决方案1】:

您可以为阵列使用动态内存。你可以用malloc分配动态数组

您可以使用realloc调整数组大小

【讨论】:

    【解决方案2】:

    有两种解决方案:

    你可以先询问用户他们打算输入多少个数字,然后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;
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      如果以后你仍然需要使用数组,你可以分配一个新的数组,这个数组的大小与你的 LinkedList 一样大,然后把它填满。

      【讨论】:

      • "...声明该大小的数组...":可能值得注意的是,这种使用 VLA 的方法需要至少支持 C99 的编译器。但是“调整大小一个已经定义的数组是不可能的。
      • 关于调整 n 已定义数组的大小,我找到了这个关于realloc的链接
      • realloc()ation 仅适用于动态分配的内存,例如使用了malloc()。一个数组通过简单的定义在栈上分配,它的大小是不能改变的。
      • 是的,我同意。那是两种不同的选择。要么获取元素数量并将该数组放入堆栈,要么动态分配数组,然后根据需要重新分配它。
      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多