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