Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2021, 18:57   #1
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию Ошибка при выполнении функции "free" в С.

Здравствуйте! Ранее создавал тему с кракозябрами на экране, но там все исправил, но теперь возникла проблема с функцией "free". Ошибка вылезает в MVS, но в Dev-CPP все работает. Помогите, пожалуйста, найти ошибку. Ошибка такая: HEAP CORRUPTION DETECTED. Значит, я где-то не так выделил память, но не могу понять, где именно.

Код:
// Для решения задачи вам нужно ввести строки с помощью функций gets или fgets, разбить строку на слова и выбрать нужные (функция scanf
// с форматом %s вводит строку до пробела, но в данной задаче вам не нужно так делать!). Стандартные функции работы со строками НЕ 
// использовать! Обратите внимание, что во всех случаях слова могут разделяться любым(!) количеством символов, не относящихся к слову
// (будем считать, что к слову относятся большие и маленькие латинские буквы и цифры). Желательно всю обработку выполнить за один проход 
// строки, хотя это возможно не во всех вариантах. Обязательно проверить работу программы на пустой строке и на строке, состоящей только из 
// символов, не относящихся к слову. Сформировать строку, добавляя к каждой заданной подстроке другую заданную подстроку.

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

#define _CRT_SECURE_NO_WARNINGS

int DefineSize(FILE* file);
void ReadStr(FILE* file, char* str, int n);
char* FormNewStr(char* str_one, int n_one, char* str_two, int n_two, char* str_three, int n_three, int amount);
int IndexOfSubstr(char* str, int n, char* substr, int ns, int start_index);
int AmountOfSubstr(char* str, int n, char* substr, int ns);
void Show(char* str);

int main(int argc, char* argv[])
{
	FILE* file_one;
	FILE* file_two;
	FILE* file_three;

	int n_one;
	int n_two;
	int n_three;

	setlocale(LC_ALL, "rus");

	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	if (argc < 3)
	{
		printf("Недостаточное число параметров.\n");
		return 0;
	}

	fopen_s(&file_one, argv[1], "r");
	fopen_s(&file_two, argv[2], "r");
	fopen_s(&file_three, argv[3], "r");
	if (file_one == NULL || file_two == NULL || file_three == NULL)
	{
		printf("Не все файлы находятся в директории проекта.\n");
		return 0;
	}

	if (feof(file_one) || feof(file_two) || feof(file_three))
	{
		fclose(file_one);
		fclose(file_two);
		fclose(file_three);

		printf("Какие-то текстовые файлы пустые.\n");

		return 0;
	}

	fseek(file_one, 0, SEEK_SET);
	fseek(file_two, 0, SEEK_SET);
	fseek(file_three, 0, SEEK_SET);

	n_one = DefineSize(file_one);
	n_two = DefineSize(file_two);
	n_three = DefineSize(file_three);

	char* str_one = (char*)malloc(sizeof(char) * n_one);
	char* str_two = (char*)malloc(sizeof(char) * n_two);
	char* str_three = (char*)malloc(sizeof(char) * n_three);

	if (str_one != NULL && str_two != NULL && str_three != NULL)
	{
		fseek(file_one, 0, SEEK_SET);
		fseek(file_two, 0, SEEK_SET);
		fseek(file_three, 0, SEEK_SET);

		ReadStr(file_one, str_one, n_one);
		ReadStr(file_two, str_two, n_two);
		ReadStr(file_three, str_three, n_three);

		fclose(file_one);
		fclose(file_two);
		fclose(file_three);

		Show(str_one);
		Show(str_two);
		Show(str_three);

		int amount = AmountOfSubstr(str_one, n_one, str_two, n_two);

		if (amount > 0)
		{
			char* new_str = FormNewStr(str_one, n_one, str_two, n_two, str_three, n_three, amount);

			Show(new_str);

			free(new_str);
		}
		else
		{
			Show(str_one);
		}
	}
	else
	{
		printf("Одна из строк пуста.\n");
	}

	return 0;
}

int DefineSize(FILE* file)
{
	int n = 0;
	char ch;

	while ((ch = fgetc(file)) != EOF)
	{
		n++;
	}

	return n;
}

void ReadStr(FILE* file, char* str, int n)
{
	fgets(str, sizeof(char) * (n + 1), file);
}

char* FormNewStr(char* str_one, int n_one, char* str_two, int n_two, char* str_three, int n_three, int amount)
{
	char* new_str = (char*)malloc(sizeof(char) * (n_one + amount * n_three + 1));
	if (new_str != NULL)
	{
		new_str[n_one + amount * n_three] = '\0';

		int copy_index = 0;
		int counter = 0;
		for (int i = 0; i < amount; i++)
		{
			int index = IndexOfSubstr(str_one, n_one, str_two, n_two, copy_index);

			for (int j = copy_index; j < index; j++)
			{
				new_str[counter] = str_one[j];
				counter++;
			}

			for (int j = index; j < index + n_three; j++)
			{
				new_str[counter] = str_three[j - index];
				counter++;
			}

			copy_index = index;
		}

		return new_str;
	}
	else
	{
		return str_one;
	}
}

int IndexOfSubstr(char* str, int n, char* substr, int ns, int start_index)
{
	if (ns > n - start_index)
	{
		return -1;
	}
	else
	{
		int i, j;
		i = start_index; j = 0;
		bool flag = true;
		int index;

		while (i < n)
		{
			while (str[i] != substr[j])
			{
				i++;
			}

			if (i < n - ns + 1)
			{
				index = i;
				j++; i++;
				for (int k = j; k < ns && str[i] != substr[k]; k++)
				{
					flag = false;
					i++;
				}

				if (flag)
				{
					return index + ns;
				}
				else
				{
					j = 0;
				}
			}
			else
			{
				return -1;
			}
		}

		return -1;
	}
}

int AmountOfSubstr(char* str, int n, char* substr, int ns)
{
	int amount = 0;

	if (ns > n)
	{
		return 0;
	}
	else
	{
		int i, j;
		i = 0; j = 0;
		bool flag = true;

		while (i < n)
		{
			while (str[i] != substr[j])
			{
				i++;
			}

			if (i < n - ns + 1)
			{
				j++; i++;
				for (int k = j; k < ns; k++)
				{
					if (str[i] != substr[k])
					{
						flag = false;
					}
					i++;
				}

				if (flag)
				{
					amount++;
				}
				
				j = 0;
			}
			else
			{
				return amount;
			}
		}

		return amount;
	}
}

void Show(char* str)
{
	str == NULL ? printf("Строка пуста.\n") : printf("%s\n", str);
}
Код:
//file_one.txt
abcdabrteab
Код:
//file_two.txt
ab
Код:
//file_three.txt
345
Код:
//Result
ab345cdab345treab345
Alexandrietz вне форума Ответить с цитированием
Старый 29.12.2021, 20:25   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Выделяете память под N символов, а записываете N + 1. Нет free для каждого malloc.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо написать "таймер", который будет запускаться при нажатии кнопки "Start", приостанавливаться на "Pause", и сбрасываться на "Reset" billiejean78 JavaScript, Ajax 1 03.09.2021 08:58
C: free() - ошибка при выполнении Colder M Помощь студентам 5 28.02.2011 15:17
C++ Builder XE. "Range check error" при выполнении программы. Zinigan C++ Builder 1 20.02.2011 08:22
ошибка при обработке функции класса "missing type specifier - int assumed" askerpro Общие вопросы C/C++ 8 02.06.2010 23:09
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06