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