-1

所以我是 c 的初学者,我正在做这个程序,用户在数组中输入值,如果值是 101,那么程序就完成了。问题是我不希望初始化数组的长度,而是当用户输入 101 时,会有最后一个值和数组中的最后一个位置。例如,他们在第三位输入了 101,那么数组的长度将为 4。我不知道这是否可能。

#include <stdio.h>


int main(void) {

  int i,j;
  int a[i];

 for(i=0;i<10;i++)
 {
   printf("Enter Value Nummber %d:",i);
   scanf("%d",&a[i]);


   if 
     (a[i] == 101) break;
     else continue;


 }

在这里,我将最大长度设置为 10,但是,例如,如果用户只给出 4 个值,然后给出 101,那么它会给出其余的点垃圾值。

4

3 回答 3

2

在这种情况下

  int a[i];

被称为可变长度数组,并且您使用的是i未初始化的,并且可以调用未定义的行为。您需要先定义一个值,i然后才能使用它。

也就是说,更清洁的方法将是(不使用动态分配和重新调整大小)

  • 定义一个上限(#define MAXLEN 100)并使用它来创建一个数组,并将其初始化为一个值(例如0)。
  • 继续询问用户输入,直到(以较早者为准)

    • 你得到一个值101
    • 柜台到达MAXLEN

否则,如果您可以使用分配的内存(malloc()/和家庭),那么: realloc()

  • 定义起始尺寸 ( #define INITSIZ 32)
  • 使用 为该大小分配内存malloc()
  • 询问用户输入。
  • 如果你得到一个输入值101free()分配的内存并退出。
  • 否则,一旦达到大小,使用双倍分配realloc()并继续上一步。
于 2020-04-07T08:12:44.980 回答
1

我建议看看malloc。它允许您动态分配内存并为您提供指向已分配内存开始的指针。

您可以使用指向第一个元素的指针访问元素,然后在每次添加值时增加指针。与其他语言不同,C 不会阻止您访问数组之外​​的值,因此使用计数器跟踪添加的项目数,并确保留在分配的内存中(因此将长度保存在变量中)。然后,您可以将 for 循环替换为无限循环,并且break一旦用户输入 value 101。当达到分配内存的限制时,您可以分配两倍大小的新数组(因此请确保将长度保存在变量中)并将前一个数组复制到那里,然后释放第一个数组。

于 2020-04-07T08:19:03.740 回答
0

我可以有一个长度不确定的数组吗?

我不希望初始化数组的长度,而是当用户输入 101 时,会有最后一个值和数组中的最后一个位置。例如,他们在第三位输入 101,那么数组的长度将为 4。我不知道这是否可能。

不,这是不可能的。

int a[i];

您不能写入不确定的数组,因为i它没有初始化 - 它包含一个垃圾值。

任何此类尝试都是未定义的行为,没有多大意义。

如果没有为它分配空间,你想如何将用户输入的值存储到假定的第三个元素中?

当然,您可以使用 VLA 或分配和重新分配动态内存(正如其他两个答案所建议的那样),但您不能将数据写入未分配用于存储该值的内存。

我不明白你背后的想法。也许你解释了你想要实现的更大目标。

于 2020-04-07T08:18:10.617 回答