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

标签 c

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

相关文章:

c - 多个窗口,单个托盘图标

c - 交换字符位并在交换后将其替换为新创建的字符

C - 将数组复制到其他数组中作为输出参数

c - 无法将字符串写入 *char[]

c - 在 header 中声明枚举,在源文件中不可见?

c - 如何使用for循环从C中的文件中读取16个字节

c++ - CLion无法编译新项目

c - 这个 C 代码是什么意思 (G_GNUC_PRINTF)?

c - sprintf 产生段错误

安卓/java/src/pcf : No such file or directory