программа не заканчивается и ничего не происходит - PullRequest
0 голосов
/ 08 марта 2019

Напишите программу, разделенную на функции с параметрами, которая будет загружать динамический массив целых чисел, пока пользователь не введет число 0. Сначала предположим, что массив будет содержать только 5 таких чисел. Если пользователь пытается ввести больше чисел, чем может сохранить таблица, программа должна обнаружить эту ситуацию и увеличить ее размер еще на 5 элементов. Программа должна повторять шаги, описанные в предыдущем предложении, всякий раз, когда таблица заканчивается в таблице и до тех пор, пока пользователь не закончит ввод чисел. Ведь программа должна вывести содержимое таблицы на экран и освободить выделенную память.

     void fill_array(int *);
void print_array(int *, int);
void *add_memory(int);
int main()
{
    int x;
    int *array_pointer = (int*)calloc(5,sizeof(int));
    if(array_pointer)
    {
        fill_array(array_pointer);
        x = sizeof(array_pointer)/sizeof(array_pointer[0]);
        print_array(array_pointer, x);
    }

    return 0;
}

void fill_array(int *array)
{
    int i = 0, k = 5;
    printf("Please fill an array with at least 5 digits: ");

    while(scanf("%d", &array[i]) != 0)
    {
        if(i > 5)
        {
            k++;
            array = (int*)add_memory(k);

        }
        i++;
    }
}

void *add_memory(int a)
{

    void *array_ptr = realloc(array_ptr,a*sizeof(int));
    return array_ptr;
}

void print_array(int *array, int b)
{
    int i;
    for(i=0;i< b;i++)
        printf("%d ",array[i]);
    puts("");
}

Ответы [ 4 ]

3 голосов
/ 08 марта 2019

Эта функция не имеет смысла:

void *add_memory(int a)
{

  void *array_ptr = realloc(array_ptr, a * sizeof(int));
  return array_ptr;
}

Вы можете вызывать realloc только по указателю, который был ранее выделен malloc, calloc или другим realloc или по NULL указателю. В вашем коде array_ptr не был инициализирован, и вызов realloc с неинициализированным указателем не закончится хорошо.

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

2 голосов
/ 08 марта 2019

Код проблемы: while(scanf("%d", &array[i]) != 0)

Давайте посмотрим возвращаемое значение scanf

NAME
       scanf,  fscanf, sscanf, vscanf, vsscanf, vfscanf 

       ...

RETURN VALUE
       These functions return the number of input items  successfully  matched
       and assigned, which can be fewer than provided for, or even zero in the
       event of an early matching failure.

       The value EOF is returned if the end of input is reached before  either
       the  first  successful conversion or a matching failure occurs.  EOF is
       also returned if a read error occurs, in which case the error indicator
       for  the  stream  (see ferror(3)) is set, and errno is set indicate the
       error.

Так что в вашем случае scanf() всегда возвращает 1 при вводе целого числа

Кстати, в вашем коде есть другие проблемы.

  1. x = sizeof(array_pointer)/sizeof(array_pointer[0])

    array_pointer - это указатель, поэтому sizeof(array_pointer)вернет размер указателя (32 или 64 или другие биты) вместо размера массива.

  2. array = (int*)add_memory(k)

    этот код будет перераспределять память, поэтому когда fill_array функция выполнена.array_pointer может указывать на освобожденный адрес.

  3. void *array_ptr = realloc(array_ptr, a * sizeof(int))

    array_ptr - неинициализированная переменная.

0 голосов
/ 08 марта 2019

Вот функциональная версия вашего кода.Вы должны ввести 0, чтобы остановить программу и распечатать полученную информацию.Хотя это не полностью завершено.Вы должны сделать следующее:

  1. Проверка ошибок
  2. Косметические изменения, например, написание комментариев и т. Д.
  3. Отмена выделения ресурсов

Хотя, кажется, больше освобождения не требуется.

#include <stdio.h>
#include <stdlib.h>

void fill_array(int *);
void print_array(int *, int);

int *add_memory(int **, int);
int k = 5;

int main()
{
    int x;
    int *array_pointer = (int*) calloc(k,sizeof(int));

    if(array_pointer)
    {
        fill_array(array_pointer);
        print_array(array_pointer, k);
    }

    if(array_pointer)
    {
    /* Deallocate the memory. */
    free(array_pointer);
    }

    return 0;
}

void fill_array(int *array)
{
    int i = 0;
    int number;
    printf("Please fill an array with at least 5 digits:");
    while(1)
    {
        printf("\r\nEnter a number: ");
        scanf("%d", &number);

        if (number == 0)
        {
            break;
        }
        else
        {
            if (i >= 4)
            {
                k++;
                array = (int*) add_memory(&array, k);

                if (!array)
                {
                    break;
                }

                array[i] = number;
            }
            else
            {
                array[i] = number;
            }

            i++;
        }

    }
}

int *add_memory(int **array_ptr, int a)
{
    printf("Allocating more memory\r\n");

    *array_ptr = realloc(*array_ptr, a*sizeof(int));

    if (!*array_ptr)
    {
        printf("Failed to allocate memory.\r\n");
    }

    return *array_ptr;
}

void print_array(int *array, int b)
{
    int i;
    printf("\r\nPrinting array\r\n");

    for(i=0;i< b;i++)
        printf("%d ",array[i]);
    puts("");
}
0 голосов
/ 08 марта 2019

Это рабочий код для fill_array.:

#include <stdlib.h>
#include <stdio.h>

#define NUMBERTHRESHOLD 5

int *fill_array(int *nbvalues)
{
  int *array_ptr = NULL;  // hint: read up the specs of realloc
  int actualsize = 0;    // actual size of dynamic array
  int index = 0;         // index of next number to be stored in array

  // initially the array is "full", it contains zero numbers
  // and there is there is space left for zero numbers

  while (1)          // loop forever
  {
    int v;
    scanf("%d", &v);

    if (v == 0)
      break;           // user entered 0 => we stop the loop

    if (actualsize == index)
    {
      // the array is full, we need to allocate space for NUMBERTHRESHOLD more numbers
      actualsize += NUMBERTHRESHOLD;
      array_ptr = realloc(array_ptr, actualsize * sizeof(int));   // reallocate memory
    }

    array_ptr[index++] = v; // store number entered by user
  }

  *nbvalues = index - 1;   // index - 1 is the actual number of numbers in array
  return array_ptr;        // return the pointer to first element of array
}

int main(void)
{
  int nbvalues;
  int *array_ptr = fill_array(&nbvalues);
}

Что нужно сделать:

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