如何将长度为长度的数组大小作为用户输入?

时间:2019-07-25 14:45:49

标签: c arrays user-input

我想通过用户输入数组长度来改善程序。在C中有可能吗?

这是我的代码:

int main() {
    int sum = 0;
    int a;
    int array[a] = {};
    printf("Insert length of array:\n");
    scanf("%d", &a);
    for (int i = 0; i < a; i++) {
        printf("Insert number %d \n", i + 1);
        scanf("%d", &array[i]);
    }
    for (int i = 0; i < a; i++) {
        sum = sum + array[i];
    }
    printf("Sum is %d \n", sum);
    return 0;
}

但是,当我尝试编译它时,它显示:error: variable-sized object may not be initialized

任何可能的解决方案?

2 个答案:

答案 0 :(得分:0)

是的,在C语言中您无法创建可变大小的数组,而在这种情况下 variable-size 意味着在编译时大小不固定的数组无法创建。但是您可以使用指针,并且在用户输入后可以分配具有适当长度的数组。

例如:

int* array;
int length;
printf("Enter length of the array: ");
scanf("%d", &length);
// maybe you need to add checking, like if length > 0
array = malloc(sizeof(int) * length);
// now you have array with `length` elements and 0..`length`-1 indexes

答案 1 :(得分:0)

程序失败的原因有多种:

  • 定义PATH使用未初始化的变量int array[a] = {};,因此程序具有未定义的行为。您必须在读取a的值之后定义此数组。

  • 可变大小的自动数组不能具有初始化程序。您必须以其他方式初始化数组,或者根本不初始化数组,因为您在以下循环中读取了值。

  • 如果大小a为负或太大,则本地数组的创建将具有未定义的行为。对于潜在的大型对象,最好使用amalloc()从堆中分配。

  • 您不测试calloc()的返回值,从而导致无效输入的不确定行为。

这是更正的版本:

scanf()

如果要处理更大的数组,可以使用#include <stdio.h> int main() { int sum; int a; printf("Insert length of array:\n"); if (scanf("%d", &a) != 1 || a <= 0 || a > 1000) { fprintf(stderr, "Invalid input\n"); return 1; } int array[a]; for (int i = 0; i < a; i++) { printf("Insert number %d:\n", i + 1); if (scanf("%d", &array[i]) != 1) { fprintf(stderr, "Invalid input\n"); return 1; } } sum = 0; for (int i = 0; i < a; i++) { sum = sum + array[i]; } printf("Sum is %d\n", sum); return 0; } 分配数组,但也可以即时计算总和,而不是将读取的值存储在数组中:

malloc()