Хранить дубли в массиве в C - PullRequest
1 голос
/ 20 июня 2019

Мне действительно нужна помощь для хранения двойных значений в двойном массиве. Я пытаюсь использовать scanf_s, и это работает. Но если я пытаюсь ввести более 4 значений, моя программа вылетает и возвращает код ошибки 3

Мне действительно нужен динамический массив, но поскольку я получаю слишком много ошибок с этим, я изменился и пытаюсь использовать общий массив, просто чтобы я мог получить хотя бы некоторые оценки для этого проекта.

Это код, который я сейчас использую ...

int main()
{
    printf("Enter white-space separated real numbers. Terminate input with ^Z\n");
    //get the dynamic array

    double numSet[1000] = { 0 };
    int size = 0;
    double number;
    while (scanf_s("%lf", &number) == 1)
    {
        numSet[size] = number;
        size++;
    }


    //sort the array using qsort 


    //range of the array 

    double min = numSet[0];
    double max = numSet[size - 1];


    //get the mean 
    double sum = 0.0;
    for (size_t i = 0; i < size; i++)
    {
        sum += numSet[i];
    }

    double mean = sum / size;



    printf("Range: [%.2f ... %.2f]\n", min, max);
    printf("Arithmetic mean is: %f", mean);



}

У меня две проблемы:

  1. Предупреждение о переполнении буфера:

    Warning C6385   Reading invalid data from 'numSet':
    the readable size is '8000' bytes, but '-8' bytes may be read.  
    
  2. Когда я пытаюсь ввести более 4 цифр, моя программа вылетает и возвращает код 3

Ответы [ 3 ]

2 голосов
/ 20 июня 2019
while (scanf_s("%lf", &number) == 1)
    {
        numSet[size] = number;
        size++;
    }

вместо этого используйте

while (scanf_s("%lf", &number) == 1 && size <= 1000)
    {
        numSet[size] = number;
        size++;
    }

Ваш цикл идет бесконечно, потому что у него нет символа завершения.scanf_s только читает значение с клавиатуры и имеет другой параметр для установки максимального значения буфера ввода, что полезно для ограничения вашего ввода.

Что вы можете сделать, это либо прочитать размер у пользователя, прежде чем позволить ему ввести значения, либоВы можете каждый раз спрашивать, хочет ли пользователь добавить дополнительные значения в массив или нет.

, например:

char option = 'Y';
while ( (scanf_s("%lf", &number) == 1 && option == 'Y'){
   // code to enter a new number
   printf("Do you want to add more numbers? (Y/N) ");
   scanf("%c", &option);
}

Кроме того, функция scanf_s возвращает количество проверенных значений.и каждый раз равен 1, так как вы всегда принимаете одно двойное значение.

Так что даже если вы удалите его, это не доставит особых хлопот.

0 голосов
/ 20 июня 2019

Я думаю, проблема в том, как вы заканчиваете цикл ввода, scanf_s не нужен, пожалуйста, смотрите окно просмотра.Я просто изменяю конечное условие на некоторое число без цифры.

Код :: Окно просмотра блоков

enter image description here

0 голосов
/ 20 июня 2019

Как уже упоминалось в комментариях, это возможно для

double max = numSet[size - 1];

оценивать как

double max = numSet[-1];

когда size = 0. Я предполагаю, что double имеет ширину 8 байт, поэтому компилятор предупреждает, что он может попытаться прочитать -1 * 8 = -8 байт из памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...