Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 178

Функция replace(). Дайте рекомендации, пожалуйста

10.06.2016, 22:19. Показов 926. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Написал не сложную функцию replace, но чувствую, что с утечками памяти тут не всё хорошо. Не могли бы дать рекомендации, как функцию можно было бы улучшить в этом плане.

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
#include <iostream>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include "windows.h"
 
using namespace std;
 
char* replace(const char* source, const char* search, const char* replace)
{
  // Проверяем входные данные
  if (source == 0)
  {
    return 0;
  }
 
  // Копируем входную строку
  int size = sizeof(char);
  std::size_t lenSource = strlen(source);
  char* sourceCopy = (char*)malloc((lenSource + 1) * size);
  strcpy(sourceCopy, source);
 
  // Если строки search и replace пустые, то просто возвращаем исходную строку
  if ((search == 0) || (replace == 0))
  {
    return sourceCopy;
  }
 
  // Выполняем подсчёт вхожений search в sourceCopy
  std::size_t lenSearch = strlen(search);
  int num = 0;
  const char* pSearch = sourceCopy;
 
  while ((pSearch = strstr(pSearch, search)) != 0)
  {
    ++num;
    pSearch += lenSearch;
  }
 
  if (num == 0)
  {
    return sourceCopy;
  }
 
  // Рассчитываем размер новой строки
  std::size_t lenReplace = strlen(replace);
  std::size_t lenDiff = lenReplace - lenSearch;
  std::size_t lenNew = lenSource + (lenDiff * num);
 
  std::size_t diff = 0;
  char* out = (char*)malloc((lenNew + 1) * size);
  const char* pZero = pSearch = sourceCopy;
 
  while ((pSearch = strstr(pSearch, search)) != 0)
  {
    diff = pSearch - pZero;
    if (diff > 0)
    {
      strncat(out, pZero, diff);
    }
    strcat(out, replace);
    pSearch += lenSearch;
    pZero = pSearch;
  }
 
  strcat(out, pZero);
  free(sourceCopy);
  return out;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    char* str = replace("sd ; d 2 sdsdsd: ;;", ";", "YUY");
    cout << str << endl;
    cin >> str;
    free(str);
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2016, 22:19
Ответы с готовыми решениями:

Мой синглтон. Дайте рекомендации, оцените, пожалуйста
Доброе утро! Вот, наваял тут типа синглтон. Можете дать замечания по данной реализации. Спасибо! //...

функция Replace
Разработайть функцию, которая заменяет натуральное число на количество единиц в нем. (Функция должна изменять само число, переданное ей в...

Неправильно работает функция replace()?
Нужно написать программу, которая заменяет в строке символ '/' на строку &quot;&quot;. Ниже дан цикл, в котором это происходит. Но замена почему-то...

1
29 / 29 / 18
Регистрация: 20.12.2010
Сообщений: 119
11.06.2016, 16:57
переписал проверки, аллокацию.
sizeof char = 1 по стандарту
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
#include <iostream>
 
using namespace std;
 
char* replace(const char* source, const char* search, const char* replace) {
    // Проверяем входные данные
    if (!source || !*source) {
        return 0;
    }
 
    // Копируем входную строку
    std::size_t lenSource = strlen(source);
    char* sourceCopy = (char*)malloc(lenSource + 1);
    strcpy(sourceCopy, source);
 
    // Если строки search и replace пустые, то просто возвращаем исходную строку
    if ((!search || !*search) || !replace) {
        return sourceCopy;
    }
 
    // Выполняем подсчёт вхождений search в sourceCopy
    std::size_t lenSearch = strlen(search);
    int num = 0;
    const char* pSearch = sourceCopy;
 
    while ((pSearch = strstr(pSearch, search)) != 0) {
        ++num;
        pSearch += lenSearch;
    }
 
    if (num == 0) {
        return sourceCopy;
    }
 
    // Рассчитываем размер новой строки
    std::size_t lenReplace = strlen(replace);
    std::size_t lenDiff = lenReplace - lenSearch;
    std::size_t lenNew = lenSource + (lenDiff * num);
 
    std::size_t diff = 0;
    char* out = (char*)calloc(lenNew + 1, 1);
    const char* pZero = pSearch = sourceCopy;
 
    while ((pSearch = strstr(pSearch, search)) != 0) {
        diff = pSearch - pZero;
        if (diff > 0) {
            strncat(out, pZero, diff);
        }
        strcat(out, replace);
        pSearch += lenSearch;
        pZero = pSearch;
    }
 
    strcat(out, pZero);
    free(sourceCopy);
    return out;
}
 
int main() {
    char* str = replace("sd ; d 2 sdsdsd: ;;", ";", "YUY");
    if (str) {
        cout << str << endl;
    }
    free(str);
    cin.get();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2016, 16:57
Помогаю со студенческими работами здесь

Запись string и функция replace
Всем привет! Задача: в командную строку подается: входной и выходной файлы, слово которое надо заменить и слово НА которое надо заменить с...

Дайте пожалуйста ответы
1) Почему при объявлении матрицы с одновременной инициализацией первые скобки можно оставить пустыми, а вторые нет? 2) Как вывести...

Дайте, пожалуйста, контрпримеры
Задача №93 в acmp задание в тему

Дайте алгоритм, пожалуйста =))
Связной граф задан матрицей смежности. Написать программу для поиска всех циклов графа. Я уже сам задал матрицу смежности, а что дольше...

Дайте пожалуйста задачку
Помогите вот с чем, изучаю C++ для себя, в среднем понимание есть, но практики нету, хотелось бы что нибудь написать интересно, но не знаю...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru