Подсчитать количество элементов массива - C (СИ)

Формулировка задачи:

Динамическая память. Одномерный массив. Массив заполняется произвольным количеством чисел. Как только с клавиатуры вводится любое отрицательное число, ввод завершается. Подсчитать количество элементов.

Код к задаче: «Подсчитать количество элементов массива - C (СИ)»

textual
#include <stdio.h>
#include <stdlib.h>
 
struct array;
typedef struct array array;
 
struct array {
    void  *data;  // данные
    size_t size;  // кол-во элементов
    size_t isize; // размер элемента
};
 
void* array_init(array*, size_t, size_t);
void* array_resize(array*, size_t);
void  array_destroy(array*);
 
int main(void) {
    array  a;     // динамический массив
    int   *ptr;   // указатель на данные в массиве
    int    var;   // переменная для ввода значения
    size_t count; // количество введенных элементов
 
    // создаем массив для 64х элементов типа int
    ptr = array_init(&a, 64, sizeof(int));
    if(NULL != ptr) { // если удалось создать
        count = 0;
        // вводим элементы, пока они есть на входе
        while(fscanf(stdin, "%d", &var) == 1) {
            if(var < 0) // условие окончания ввода
                break;
 
            if((count+1)>=a.size) { // массив заполнен
                // увеличиваем размер
                int * tmp = array_resize(&a, a.size + a.size);
                if(tmp) {
                    ptr = tmp;
                }
                else // увеличить не удалось
                    break;
            }
            ptr[count] = var; // запоминаем введеное значение
            ++count;
        }
        fprintf(stdout, "You enter %ud elements\n", count);
        array_destroy(&a); // удаляем массив
    }
    return EXIT_SUCCESS;
}
 
void* array_resize(array *self, size_t size) {
    void* ptr = NULL;
    if(self->size != size) {
        if(self->data) {
            ptr = realloc(self->data, size*self->isize);
            if(NULL == ptr)
                if(0 != size)
                    return NULL;
            self->data = ptr;
            self->size = size;
        }
        else {
            if(size) {
                ptr = calloc(size, self->isize);
                if(ptr) {
                    self->data = ptr;
                    self->size = size;
                }
            }
        }
    }
    return ptr;
}
void* array_init(array *self, size_t size, size_t isize) {
    self->data = calloc(size, isize);
    if(self->data) {
        self->size = size;
        self->isize = isize;
    }
    return self->data;
}
void array_destroy(array* self) {
    if(self->data) {
        free(self->data);
        self->data = NULL;
        self->size = 0;
        self->isize = 0;
    }
}

10   голосов, оценка 3.800 из 5


СОХРАНИТЬ ССЫЛКУ
Похожие ответы