Сформировать массив строк. Удалить из него К последних строк - C (СИ)

Узнай цену своей работы

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

Сформировать массив строк. Удалить из него К последних строк на языке СИ.

Реализовать функцию, организующую работу с динамически выделяемым многомерным массивом/ ● Массив (указатель на указатель или массив указателей) должен выделяться с помощью функций malloc () / calloc () в функции main (). ● Элементы массива могут вводиться в диалоговом режиме или задаваться с помощью датчика случайных чисел. ● Сформированный массив должен передаваться в качестве параметра в функцию. ● Для выполнения задания в функции допустимо динамически создавать новые массивы. ● Для работы со строками и областями памяти можно использовать функционал стандартной библиотеки языка Си. ● После достижения поставленных в задании целей необходимо удалять динамически выделенные массивы с помощью функции free (). ● В результате задания в функции main () должен быть выведен на экран результирующий массив, полученный в ходе выполнения реализованной функции.

Решение задачи: «Сформировать массив строк. Удалить из него К последних строк»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define MAX_DBLOCK    8
 
typedef struct {
    char** arr;
    size_t len;
    size_t cnt;
} string_t;
 
static int ___string_alloc(string_t* s, size_t n);
static int ___string_insert(string_t* s, size_t index, const char* str, size_t len);
#define string_size(s)   (s).cnt
#define string_get(s, i) (s).arr[(i)]
 
void string_init(string_t* s);
int  string_add(string_t* s, const char* str);
int  string_addn(string_t* s, const char* str, size_t n);
int  string_insert(string_t* s, size_t index, const char* str);
int  string_set(string_t* s, size_t index, const char* str);
int  string_erase(string_t* s, size_t index, size_t cnt);
void string_clear(string_t* s);
int  string_explode(string_t* s, const char* str, const char* delim);
 
 
int main(void){
    size_t i;
    string_t s;
    char str[] = "заяц||белка||бобр||скунс||собака||"\
                 "слон||тигр||лиса||соболь||шимпанзе||"\
                 "росомаха||лев||пантера||пума||кугуар";
 
    string_init(&s);
    string_explode(&s, str, "||");
 
    for(i = 0; i < string_size(s); ++i)
        puts(string_get(s, i));
    putchar('\n');
 
    string_insert(&s, 0, "\tпосле удаления");
    string_erase(&s, 3, 5);
    string_add(&s, "\tконец");
 
    for(i = 0; i < string_size(s); ++i)
        puts(string_get(s, i));
 
    string_clear(&s);
    return 0;
}
 
//инициализация
void string_init(string_t* s){
    s->arr = NULL;
    s->cnt = 0;
    s->len = MAX_DBLOCK;
}
 
//вставка строки в конец массива
int string_add(string_t* s, const char* str){
    return ___string_insert(s, s->cnt, str, strlen(str));
}
 
//вставка строки в конец массива
int string_addn(string_t* s, const char* str, size_t n){
    return ___string_insert(s, s->cnt, str, n);
}
 
//произвольная вставка строки по-индексу
int string_insert(string_t* s, size_t index, const char* str){
    return ___string_insert(s, index, str, strlen(str));
}
 
//присвоить новую строку по-индексу
int string_set(string_t* s, size_t index, const char* str){
    char*  p;
    size_t n1, n2;
    if(index < s->cnt){
        n1 = strlen(s->arr[index]);
        n2 = strlen(str);
        if(n1 >= n2)
            strcpy(s->arr[index], str);
        else {
            p = (char*)realloc(s->arr[index], (n2 + 1) * sizeof(char));
            if(p == NULL)
                return 0;
            strcpy(p, str);
            s->arr[index] = p;
        }
        return 1;
    }
    return 0;
}
 
//удаление элементов массива-строк
int string_erase(string_t* s, size_t index, size_t cnt){
    size_t i, j;
    if((index + cnt) > s->cnt)
        return 0;
    for(i = index; i < (index + cnt); ++i)
        free(s->arr[i]);
 
    s->cnt -= cnt;
    for(i = index, j = index + cnt; i < s->cnt; ++i)
        s->arr[i] = s->arr[j++];
    return 1;
}
 
//удаление всего массива
void string_clear(string_t* s){ 
    size_t i;
    for(i = 0; i < s->cnt; ++i)
        free(s->arr[i]);
 
    if(s->arr != NULL)
        free(s->arr);
    string_init(s);
}
 
//разделение строки по указанному разделителю
int string_explode(string_t* s, const char* str, const char* delim){
    const char* p;
    size_t n2, n1 = strlen(delim);
 
    s->cnt = 0;
    p      = str;
    while((p = strstr(p, delim)) != NULL){
        if((n2 = (size_t)(p - str)) > 0){
            if(! string_addn(s, str, n2))
                return 0;
        }
        p  += n1;
        str = p;
    }
    return (*str) ? string_add(s, str) : 1;
}
 
//произвольная вставка строки по-индексу
static int ___string_insert(string_t* s, size_t index, const char* str, size_t len){
    char*  p;
    size_t i;
    if(index > s->cnt)
        return 0;
    if((p = (char*)malloc((len + 1) * sizeof(char))) == NULL)
        return 0;
    strncpy(p, str, len);
    p[len] = '\0';
 
    if(! ___string_alloc(s, 1)){
        free(p);
        return 0;
    }
    for(i = s->cnt; i > index; --i)
        s->arr[i] = s->arr[i - 1];
 
    s->arr[index] = p;
    ++(s->cnt);
    return 1;
}
 
//аллокация для массива указателей
static int ___string_alloc(string_t* s, size_t n){
    char** p;
    size_t i;
    if(s->arr == NULL){
        i = s->len;
        if(n > i)
            i = n;
        s->arr = (char**)malloc(i * sizeof(char*));
        if(s->arr == NULL)
            return 0;
        s->len = i;
    } else if((s->cnt + n) >= s->len){
        i = s->cnt + n + s->len / 2;
        p = (char**)realloc(s->arr, i * sizeof(char*));
        if(p == NULL)
            return 0;
        s->arr = p;
        s->len = i;
    }
    return 1;
}

Объяснение кода листинга программы

  1. Объединение строк из массива, разделенных символом ||, в одну строку.
  2. Вставка строки после удаления в начало массива.
  3. Удаление из массива строк последних 5 элементов.
  4. Вставка строки конец в конец массива.
  5. Вывод на экран всех строк из массива.
  6. Вставка строки по индексу 0.
  7. Вставка строки по индексу 3.
  8. Вставка строки по индексу 5.
  9. Удаление элементов массива строк по индексам 3 и 5.
  10. Удаление всех элементов массива строк.
  11. Разделение строки заяц||белка||бобр||скунс||собака||слон||тигр||лиса||соболь||шимпанзе||росомаха||лев||пантера||пума||кугуар на подстроки, используя символ || в качестве разделителя.
  12. Вставка строки после удаления перед строкой скунс.
  13. Удаление из массива строк последних 5 элементов.
  14. Вставка строки конец после строки кугуар.
  15. Вывод на экран всех подстрок из массива строк.
  16. Вставка строки после удаления в начало массива.
  17. Удаление элементов массива строк по индексам 3 и 5.
  18. Удаление всех элементов массива строк.
  19. Разделение строки заяц||белка||бобр||скунс||собака||слон||тигр||лиса||соболь||шимпанзе||росомаха||лев||пантера||пума||кугуар на подстроки, используя символ || в качестве разделителя.
  20. Вставка строки после удаления перед строкой скунс.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы