Некоторые трудности с Си - 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) с целью выделения достаточного количества памяти для хранения данных.