gpt4 book ai didi

c - 如何读取表示数组元素的以空格分隔的整数并在 C 中对它们求和

转载 作者:行者123 更新时间:2023-12-04 11:43:55 27 4
gpt4 key购买 nike

如何读取代表数组元素的以空格分隔的整数并在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com