如何读取代表数组元素的以空格分隔的整数并在 C 中对它们求和? 我使用了下面的代码,但它读取了新行中的所有元素:
#include <math.h>
#include <stdio.h>
int main() {
int i = 0, N, sum = 0, ar[i];
scanf("%d" , &N);
for (i = 0; i < N; i++) {
scanf("%d", &ar[i]);
}
for (i = 0; i < N; i++) {
sum = sum + ar[i];
}
printf("%d\n", sum);
return 0;
}
最佳答案
您的数组 ar
定义为 0
的大小:如果用户为项目数输入非零数字,代码将调用未定义的行为。
此外,您应该检查 scanf()
的返回值:如果用户输入的内容不被识别为数字,您的程序将调用未定义的行为而不是优雅地失败。
这是更正后的版本:
#include <stdio.h>
int main(void) {
int i, N, sum;
if (scanf("%d", &N) != 1 || N <= 0) {
fprintf(stderr, "invalid number\n");
return 1;
}
int ar[N];
for (i = 0; i < N; i++) {
if (scanf("%d", &ar[i]) != 1) {
fprintf(stderr, "invalid or missing number for entry %d\n", i);
return 1;
}
}
sum = 0;
for (i = 0; i < N; i++) {
sum += ar[i];
}
printf("%d\n", sum);
return 0;
}
请注意,对于足够大的 N
值,程序仍然会失败,因为没有标准方法来检查您是否使用自动存储分配了太多数据。它将调用未定义的行为(又名堆栈溢出)。
您应该使用 malloc()
分配数组以避免这种情况:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i, N, sum;
int *ar;
if (scanf("%d", &N) != 1 || N <= 0) {
fprintf(stderr, "invalid number\n");
return 1;
}
ar = malloc(sizeof(*ar) * N);
if (ar == NULL) {
fprintf(stderr, "cannot allocate array for %d items\n", N);
return 1;
}
for (i = 0; i < N; i++) {
if (scanf("%d", &ar[i]) != 1) {
fprintf(stderr, "invalid or missing number for entry %d\n", i);
return 1;
}
}
sum = 0;
for (i = 0; i < N; i++) {
sum += ar[i];
}
printf("%d\n", sum);
free(ar);
return 0;
}
最后,如果数字的总和超出int
类型的范围,仍然有可能出现未定义的行为。很少有程序员关心检测此类错误,但可以通过以下方式完成:
#include <limits.h>
...
sum = 0;
for (i = 0; i < N; i++) {
if ((sum >= 0 && arr[i] > INT_MAX - sum)
|| (sum < 0 && arr[i] < INT_MIN - sum)) {
fprintf(stderr, "integer overflow for entry %d\n", i);
return 1;
}
sum += ar[i];
}
关于c - 如何读取表示数组元素的以空格分隔的整数并在 C 中对它们求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346797/