Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中声明具有未知条目数的数组?_C_Arrays_Function - Fatal编程技术网

如何在C中声明具有未知条目数的数组?

如何在C中声明具有未知条目数的数组?,c,arrays,function,C,Arrays,Function,问题如下: 编写一个函数,提示用户输入一系列以值-1结尾的正整数。然后,该函数必须返回用户输入的最大值和最小值。您可以假设用户在输入-1之前至少输入一个正整数 所以我想创建一个数组来存储所有输入的值。唯一的问题是,我不太确定如何声明具有未知条目数的数组,因为很明显,我不知道用户将在-1之前输入多少个整数 然后对于后一部分,我想让maximum/minimum=arr[0],然后是index++,一旦arr[index]>maximum或arr[index] 谢谢大家! 不幸的是,你不能——至少不

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

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

然后对于后一部分,我想让maximum/minimum=arr[0],然后是index++,一旦arr[index]>maximum或arr[index] 谢谢大家!

不幸的是,你不能——至少不能直接。使用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


}
while(未完成){
如果(数组已满){
多少个*=2;
整数*新的整数=(整数*)malloc(sizeof(整数)*多少);
对于(int i=0;i
使用动态内存分配函数,如malloc calloc和realloc 或者,如果您对编写真正优秀的代码感兴趣,请使用linkedlist

顺便问一下,是否有必要将所有数字存储在一个数组中???你可以在飞行中检查最小值和最大值

一个简单的算法是:

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

    if(inputval > maxval)
       maxval = inputval;
}
intmaxval=0,minval=0;
while(inputval!=-1)
{
如果(输入值<最小值)
minval=输入值;
如果(输入值>最大值)
maxval=输入值;
}

您可以使用动态内存分配,尤其是
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++;
} 
intmin=-1;
int max=-1;
int i=0;
int*array=malloc(sizof(int));
而(scanf(“%d”,&x)>0&&x>0)
{
如果(i>0)
realloc(数组,(i+1)*sizeof(int));
否则{
min=x;
max=x;
}
数组[i]=x;
如果(x>max)max=x;

如果(x)因为您只需要报告最小值和最大值,为什么不只报告两个值,将它们都设置为第一个输入,然后在处理每个新输入时替换任何需要的值(如果其中一个需要)。因此您总共只需要三个值(最小值、最大值和cur)换言之,如果用户输入的值不是最小值或最大值,为什么还要麻烦保留它呢?@WhozCraig看起来我们的想法是以完全相同的速度匹配的。@WhozCraig是的thx!:有没有更简单的方法呢?我刚开始学习C,并且很确定我从来没有听说过。不过这是giv作为我们期中考试的示例问题,可能还有其他方法吗?@JuicyThio这很简单,应该学习如何使用这些函数。@H2CO3好的!我会的,期中考试之后!现在你已经提到了,我想我可以只检查最小值和最大值而不存储它们!@crash代码可以工作,但它破坏了JuicyThio的练习。我不要用简单的语言暗示算法,不要给出家庭作业问题的完整答案。