Некоторые трудности с Си - C (СИ)

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

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

Здравствуйте. Помогите исправить ошибку в программе.
#include <stdio.h>
#include <malloc.h>
#include <locale.h>
#include <string.h>
#define MAXSET 1000
#define ERROR "Ошибка: Некорректный ввод\n"
 
int GetDigit_0_999();
char *GetLine();
char *CatLine(char *ptr_line, char *bufline);
void WriteLines(char **ptr_lines);
int LenLine(char *ptr_line);
 
int main()
{
    setlocale(LC_ALL, "RUS");
    int i, type, num = 0;// dig, dig2, first, second;
    char **ptr_lines = (char **)malloc(1);
    char *ptr_line = NULL;
    char Menu[][40] = {
        "Выход\n",
        "Ввести строку\n",
        "Взять подстроку\n",
        "Склеить 2 строки\n",
        "Разбить строку на слова\n",
        "Вывести доступные строки\n",
        "Узнать длину строки\n",
        "Удалить строку\n"
    };
    do {
        for (i = 0; i < 8; i++)
            printf("%d.%s", i, Menu[i]);
        printf("Выберите действие:");
        switch (type = GetDigit_0_999()) {
        case 1:
            if (ptr_line = GetLine()) {
                *(ptr_lines + num++) = ptr_line;
                ptr_lines = (char **)realloc(ptr_lines, num + 1); // Эта строчка делает что-то не то
                *(ptr_lines + num) = NULL;
            }
            else
                printf("%s", ERROR);
            break;
        case 5:
            if (ptr_lines)
                WriteLines(ptr_lines);
            else
                printf("Нет доступных строк\n");
        }
    } while (type);
    return 0;
}
 
int GetDigit_0_999() //РАБОТАЕТ
{
    unsigned int dig;
    scanf_s("%u", &dig);
    while (getchar() != '\n');
    if (dig >= 0 && dig < 1000)
        return dig;
    return EOF;
}
 
char *GetLine() //РАБОТАЕТ, необходимы тесты
{
    char *ptr_line = (char *)malloc(1);
    char buf[101];
    int n, len = 0;
    *ptr_line = '\0';
    do {
        n = scanf_s("%50[^\n]", buf, 101);
        if (n > 0) {
            len += LenLine(buf);
            ptr_line = (char *)realloc(ptr_line, len + 1);
            CatLine(ptr_line, buf);
        }
        else if (n == 0)
            scanf_s("%*c");
        else {
            free(ptr_line);
            ptr_line = NULL;
        }
    } while (n > 0);
    return ptr_line;
}
 
char *CatLine(char *ptr_line, char *bufline) //РАБОТАЕТ
{
    char *ptr_line2 = ptr_line;
    for (; *ptr_line2; ptr_line2++);
    while (*ptr_line2++ = *bufline++);
    return ptr_line;
}
 
void WriteLines(char **ptr_lines) //
{
    int i = 0;
    while (ptr_lines) {
        printf("%s\n", *ptr_lines++);
    }
}
 
int LenLine(char *ptr_line) //РАБОТАЕТ
{
    char *ptr_line2 = ptr_line;
    for (; *ptr_line; ptr_line++);
    return ptr_line - ptr_line2;
}

Решение задачи: «Некоторые трудности с Си»

textual
Листинг программы
realloc(ptr_lines, 4*(num + 1))

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

В данном коде выполняется операция realloc, которая изменяет размер блока памяти, выделенного под переменную ptr_lines. В качестве аргументов функции realloc выступают указатель на данный блок памяти (ptr_lines) и новое значение его размера (4(num + 1)). Таким образом, код увеличивает размер блока памяти, выделенного под ptr_lines, до 4(num + 1) с целью выделения достаточного количества памяти для хранения данных.

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

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