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



我想通过数组长度的用户输入来改进我的程序。这在 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

有什么可能的解决方案吗?

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

例如:

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

程序失败的原因有多种:

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

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

  • 如果大小a为负数或太大,则创建本地数组将具有未定义的行为。对于潜在的大型对象,最好从具有malloc()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 inputn");
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 inputn");
return 1;
}
}
sum = 0;
for (int i = 0; i < a; i++) {
sum = sum + array[i];
}
printf("Sum is %dn", sum);
return 0;
}

如果要处理较大的数组,可以使用malloc()分配数组,但也可以动态计算总和,而不将读取的值存储在数组中:

#include <stdio.h>
int main() {
int a, value, sum;
printf("Insert length of array:n");
if (scanf("%d", &a) != 1 || a < 0) {
fprintf(stderr, "Invalid inputn");
return 1;
}
sum = 0;
for (int i = 0; i < a; i++) {
printf("Insert number %d:n", i + 1);
if (scanf("%d", &value) != 1) {
fprintf(stderr, "Invalid inputn");
return 1;
}
sum += value;
}
printf("Sum is %dn", sum);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新