为什么我的程序在完成之前只接受一个输入?

时间:2018-03-02 22:24:23

标签: c

该程序使用数组和三个函数来读取输入,总结输入整数的1和10位,并计算输入整数的平均值。为什么我不能获得多个正整数的输入?程序在一个有效的整数限制内输入后运行。

#include <stdio.h>

int read_data(int Ar[]);
void comp_sums(int Ar[], int size); // prototypes
double comp_avg(int Ar[], int size);

int main()
{
    int Ar[100];
    int size;
    double avg;
    size = read_data(Ar);
    comp_sums(Ar, size);
    avg = comp_avg(Ar, size);
    printf("The average of the integers in the array: %lf\n", avg);
}

int read_data(int Ar[])  // reads inputted integers, stores in array
{
    int flag;
    char ch;
    int i,j, num;

    flag = 1;
    i = 0;
    while (flag == 1) {
        printf("Please enter an integer:\n");

        j = scanf("%d", &num);
        if (j != 1) {
            break;
        }

        if (num < 0) {
            continue;
        } else if (num >= 100) {
            flag = 0;
        } else {
            Ar[i] = num;
            i++;
        }
        return i;
    }
}


void comp_sums(int Ar[], int size)   /* computes sum of ones and tens place of the inputted integers into the array*/
{
    int i, j;
    int sum_ones, sum_tens;
    sum_ones = 0;
    sum_tens = 0;
    for (i = 0; i < size; i++) {
        sum_ones += Ar[i] % 10;
        j = Ar[i] / 10;
        sum_tens += j % 10;
    }
    printf("The sum of the ones is: %d\n", sum_ones);
    printf("The sum of the tens is: %d\n", sum_tens);
}

double comp_avg(int Ar[], int size) // computes average of integers
{
    int i, sum;
    double avg;
    sum = 0;
    for (i = 0; i < size; i++) {
        sum += Ar[i];
    }
    avg = (double)size / sum;
    return avg;
}

2 个答案:

答案 0 :(得分:1)

当你以数组作为参数时,你也需要考虑长度, 因为你必须检查你是否正在读/写界限。忘记一个 第二,返回位于该错误位置,用户可以输入更多 数值可以容纳的值,并且您无法阻止缓冲区溢出。

所以要修复你的read_data功能:

int read_data(int Ar[], size_t len)
{
    if(Ar == NULL || len == 0)
        return 0;

    int i = 0, j, num;

    // imortant to check the bounds
    while (i < len) {
        printf("Please enter an integer:\n");

        j = scanf("%d", &num);
        if (j != 1) {
            break;
        }

        if (num < 0) {
            continue;
        } else if (num >= 100) {
            break;
        } else {
            Ar[i] = num;
            i++;
        }
    }

    return i;
}

我删除了flag位,因为如果num >=100,您将结束循环 无论如何,做break要简单得多。意图也更加清晰。

现在你可以打电话给它:

int main()
{
    int Ar[100];
    int size;
    double avg;
    size = read_data(Ar, sizeof Ar / sizeof *Ar);
    ...
}

答案 1 :(得分:0)

问题是您在return循环内调用了while。所以只要你得到一个有效的数字,你就会从函数返回。

将它移到循环外面。像:

while (flag == 1) {
    printf("Please enter an integer:\n");

    j = scanf("%d", &num);
    if (j != 1) {
        break;
    }

    if (num < 0) {
        continue;
    } else if (num >= 100) {
        flag = 0;
    } else {
        Ar[i] = num;
        i++;
    }
    // return i;  Incorrect
}
return i;  // Correct