Пользователь
Регистрация: 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_three.txt
345
Код:
//Result
ab345cdab345treab345
|