如何读取表示数组元素的以空格分隔的整数,并将它们用C求和

Vem*_*van 2 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;
}
Run Code Online (Sandbox Code Playgroud)

chq*_*lie 5

您的数组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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,程序仍然会因足够大的值而失败,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;
}
Run Code Online (Sandbox Code Playgroud)

最后,如果数字的总和超出类型范围,则仍有可能存在未定义的行为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];
    }
Run Code Online (Sandbox Code Playgroud)