【问题标题】:How do you declare an array with unknown number of entries in C?如何在 C 中声明一个条目数未知的数组?
【发布时间】:2013-03-01 05:44:59
【问题描述】:

问题如下: 编写一个函数,提示用户输入一系列以值 -1 结尾的正整数。然后该函数必须返回用户输入的最大值和最小值。您可以假设用户在输入 -1 之前至少输入了一个正整数。

所以我的想法是创建一个数组来存储所有输入的值。唯一的问题是我不太确定如何声明一个包含未知条目数的数组,因为显然我不知道用户将在 -1 之前输入多少个整数。

然后对于后面的部分,我在想让maximum/minimum=arr[0],然后index++,一次arr[index]>maximum或者arr[index]

谢谢!

【问题讨论】:

  • 既然你只需要报告最小值和最大值,为什么不只设置两个,将它们都设置为第一个输入,然后替换需要它的任何一个(如果甚至做)当你处理每一个新的输入。因此,您总共只需要三个值(min、max 和 cur)。换句话说,如果用户输入了一个值,而您已经知道它不是最小值或最大值,为什么还要保留它呢?
  • @WhozCraig 看起来我们的想法以完全相同的速度匹配..
  • @WhozCraig 是的,谢谢! :D

标签: c arrays function


【解决方案1】:

使用动态内存分配函数,例如 malloc calloc 和 realloc 或者如果你有兴趣做一些真正好的代码使用链表。

顺便说一句,是否有必要将所有数字存储在一个数组中???你可以即时检查最小值和最大值???

一个简单的算法是:

int maxval=0, minval = 0;
while(inputval != -1)
{
    if(inputval < minval)
       minval = inputval;

    if(inputval > maxval)
       maxval = inputval;
}

【讨论】:

  • 有更简单的方法吗?我刚刚开始学习 C 并且很确定我从未听说过这些。但是,这是作为我们期中考试的示例问题给出的,所以可能还有其他方法可以做到吗?
  • @JuicyThio 这很简单,应该学习如何使用这些功能。
  • @H2CO3 好的!期中过后,我会的!
  • 现在你已经提到了,我想我可以只检查最小值和最大值而不存储它们!
  • @crashed 代码可以工作,但它破坏了 JuicyThio 的练习。我试图用简单的语言来暗示算法,而不是给出一个完整的家庭作业问题的解决方案。
【解决方案2】:

不幸的是,你不能——至少不能直接。使用 malloc() 您可以分配具有可变长度的数组,并且可以使用它来继续分配更多空间。例如

int* numbers = malloc(sizeof(int)*how_many);
if (!numbers) {
  //error
}

//do stuff.

在您的示例中,您可以执行类似的操作

while(not_done) {
  if( array-is-full ) {
    how_many *= 2;
    int* new_numbers = (int*)malloc(sizeof(int)*how_many);
    for(int i = 0; i < index;i++)
       new_numbers[i] = numbers[i];
    free(numbers);
    numbers = new_numbers;
  }

  //read user input
  //stick it into the array


}

【讨论】:

【解决方案3】:

您可以使用动态内存分配,尤其是realloc。它允许您在每次输入新元素时调整数组的大小

顺便说一句,如果您想从输入中提取最小值和最大值,则不需要将输入参数保存到数组中。

在将元素保存到动态数组并提取最小值和最大值之后的任何方式

int min = -1;
int max = -1;
int i = 0;

int *array=malloc(sizof(int));

while (scanf("%d", &x)>0 && x>0)
{
    if(i>0)
        realloc(array, (i+1)*sizeof(int));
    else {
        min = x;
        max = x;
    }
    array[i] = x;
    if (x>max) max = x;
    if (x<min) min = x;
    i++;
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2020-02-15
    相关资源
    最近更新 更多