Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933

Ошибка при освобождении памяти

18.12.2021, 20:28. Показов 1110. Ответов 23
Метки нет (Все метки)

Задача, найти в строке подстроку и заменить другой строкой. Получаю ошибку при освобождении памяти. Не понимаю что я делаю не так Сама строка формируется верно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#define _CRT_SECURE_NO_WARNINGS
#include <locale.h>
#include <stdio.h>
 
int strLen(const char* str)
{
    int count = 0;
    if (str != NULL)
    {
        while (*str != '\0')
        {
            count++;
            str++;
        }
    }
    return count;
}
 
char* findSubStrInStr(const char* str, const char* subStr)
{
    const char* tmpSubStr = subStr;
    while (*str++ && *tmpSubStr)
    {
        if (*str == *tmpSubStr)
            tmpSubStr++;
        else
            tmpSubStr = subStr;
        if (!*tmpSubStr)
            return str - strLen(subStr) + 1;
    }
    return 0;
}
 
 
int subStrCount(const char* str, const char* subStr)
{
 
    int count = 0;
    const char* str_ = str;
    str_ = findSubStrInStr(str_, subStr);
    while (str_ != NULL)
    {
        count++;
        if (++str_ != NULL)
            ++str_;
        else
            break;
        str_ = findSubStrInStr(str_, subStr);
    }
    return count;
}
 
int findIndexSubStr(const char* str, const char* subStr)
{
    int subStrLen = strLen(subStr);
    int strLength = strLen(str);
    const char* tmpSubStr = subStr;
    while (*str && *tmpSubStr)
    {
        if (*str++ == *tmpSubStr)
            tmpSubStr++;
        else
            tmpSubStr = subStr;
        if (!*tmpSubStr)
        {
            char* string = str - subStrLen;
            return strLength - strLen(string);
        }
 
    }
    return -1;
}
void* mymemcpy(void* dest, const void* src, int bytes)
{
    char* cdest = (char*)dest;
    const char* csrc = (char*)src;
    for (size_t i = 0; i < bytes; i++)
        *cdest++ = *csrc++;
    return dest;
 
}
 
char* replaceSubstring(char* str, char* subStr, char* repStr)
{
    int indSubstr = findIndexSubStr(str, subStr);
    if (indSubstr == -1)
        return NULL;
    int lenStr = strLen(str), lenSub = strLen(subStr), lenRep = strLen(repStr);
    int lenResult = lenStr - lenSub + lenRep + 1;
    char* result = (char*)malloc(lenResult * sizeof(char));
    mymemcpy(result, str, indSubstr);
    mymemcpy(result + indSubstr, repStr, lenRep);
    mymemcpy(result + indSubstr + lenRep, str + indSubstr + lenSub, lenStr - indSubstr + lenSub);
    //lenResult = lenResult - 1;
    result[--lenResult] = 0;
    free(result); // пока пусть будет тут, все равно не работает
    return result;
}
 
int main()
{
    char* tmp = replaceSubstring("helloworld", "hello", "world");
    printf_s("%s", tmp);
    free(tmp);
    return 0;
}
Ой простите, ошибся разделом немного
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2021, 20:28
Ответы с готовыми решениями:

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; #include &lt;stdlib.h&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; void *malloc (size_t...

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; template&lt;class T&gt; class pvector { T **p; int sz; public:

Ошибка при освобождении памяти
Здравствуйте! Пишу на MS Visual C++ 2010, windows 7. При вызове функции resize() на строке delete arr; происходит ошибка,...

23
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
18.12.2021, 21:33  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это наверное что-то говорит о некоем уютном мирке, в котором живет ваш компилятор, а также (и даже скорее) о том, как вы сами этот компилятор сконфигурировали. Но к языкам С и С++ все это никакого отношения не имеет.
В том что компилятор VS2019 (не 2010 !!!) дал запустить этот код виноват в этом точно не я, а скорее разработчик компилятора, ведь это не логическая ошибка.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
18.12.2021, 21:49
Цитата Сообщение от Senarist Посмотреть сообщение
В том что компилятор VS2019 (не 2010 !!!) дал запустить этот код виноват в этом точно не я, а скорее разработчик компилятора, ведь это не логическая ошибка.
Я могу лишь повторить: спецификации языков С и С++ требуют, чтобы в ответ на ошибочный код компилятор выдал какое-то диагностическое сообщение. Что в нем написано ("error", "warning" или "kva kva kva") - не оговаривается.

Что происходит после этого, спецификации языков С и С++ не оговаривают. Они лишь говорият, что после выдачи стандартного диагностического сообщения ваша программа уже НЕ является программой на С или С++. Языки С и С++ в этот момент умывают руки и выходят за дверь.

А после выдачи стандартного диагностическое сообщения ваш компилятор волен делать все, что угодно. Он может остановить компиляцию или продолжать компиляцию. Он может "давать запустить" или "не давать запустить" - это уже вопрос, который к С и С++ отношения не имеет.

Ваш компилятор полностью соблюл (соблюл?) требования станадарта языка - он выдал стандартное диагностическое сообщение. Увидеть и распознать это стандартное диагностическое сообщение - ваша задача.

А то, что он при этом не прервал компиляцию и даже "дал запустить" - имеет право. Но формально это уже не программа на С.
1
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
18.12.2021, 21:51  [ТС]
Спасибо. Буду обращать внимание на все сообщения компилятора.
Да, "соблюл" есть такое слово)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
18.12.2021, 21:55
Цитата Сообщение от Senarist Посмотреть сообщение
Буду обращать внимание на все сообщение компилятора.
Для того, чтобы вам было проще отличать стандартные диагностическое сообщения от действительно невинных "просто warning-ов", многие комипиляторы предоставляют "строгий" режим. Например, в GCC и Clang это режим -pedantic-errors. В этом режиме все стандартные диагностические сообщения рапортуются как "error" и тут же прерывают компиляцию.

В VS, насколько я знаю, такой возможности нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.12.2021, 21:55

Ошибка при освобождении памяти
Здравствуйте, программа завершает работу в этом коде #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cmath&gt; int...

Ошибка при освобождении памяти
Все идет замечательно, но вот когда происходит удаление массива программа крашится.. #include &lt;iostream&gt; using namespace...

Ошибка при освобождении памяти
Здравствуйте. Знаю, что тема уже много раз поднималась в самых разнообразных местах и с очень отличающимися примерами, но, увы, я тоже с...

Ошибка при освобождении памяти
Короче, есть простенький метод класса, в котором за полем под названием ID закрепляется новое айди. При это память, в которой хранилось...

Ошибка при освобождении памяти
Имеются следующие поля класса (интересует именно указатель *hobby): private: char name; char *hobby; double weight; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru