|
|
|
| Доброго времени суток! Передо мной стоит задача, написать функцию замены всех вхождений подстроки в строке. Функция по моей задумке должна иметь три аргумента: искомая строка, заменяемая стока и текст с котором необходимо выполнить данные действие. Вот что у меня пока получаеся:
void StrReplace (char* Search, char* Replace, char* Resource)
{
char* Pointer = strstr (Resource, Search);
while (Pointer)
{
int SearchLen = strlen (Search);
int ReplaceLen = strlen (Replace);
int ResourceLen = strlen (Resource);
int PointerLen = strlen (Pointer);
char* NewText = new char [ResourceLen - SearchLen + ReplaceLen + 1];
strncpy (NewText, Resource, ResourceLen - PointerLen);
strcpy (NewText, Replace);
strcpy (NewText, Pointer + SearchLen);
.............
Pointer = strstr (Resource, Search);
}
}
|
Так вот как вы видите я не могу записать результат работы функции в исходную строку. Ну не получается у меня чтобы я не пробовал... Помогите! Что делать? Или может быть есть уже подобная стандартная функция? | |
|
|
|
|
|
|
|
для: MHz
(16.10.2008 в 17:02)
| | В общем не знаю на сколько хорошо у меня получилось решить задачу, но вот что у меня получилось:
char* StrReplace (char* Search, char* Replace, char* Resource)
{
int SearchLen = strlen (Search);
int ReplaceLen = strlen (Search);
char* Pointer = strstr (Resource, Search);
while (Pointer != NULL)
{
int PointerLen = strlen (Pointer);
int ResourceLen = strlen (Resource);
char* NewText = (char*)calloc((ResourceLen - SearchLen + ResourceLen), sizeof(char));
strncpy (NewText, Resource, ResourceLen - PointerLen);
strcat (NewText, Replace);
strcat (NewText, Pointer + SearchLen);
Resource = (char*)realloc(Resource, (ResourceLen - SearchLen + ReplaceLen)*sizeof(char));
for (int i = 0; i < (ResourceLen - SearchLen + ReplaceLen); i++)
{
Resource[i] = NewText[i];
}
free (NewText);
Pointer = strstr (Resource, Search);
}
return Resource;
}
|
Вроде бы работает =) Но может быть будут какие нибудь замечания? | |
|
|
|
|
|
|
|
для: MHz
(16.10.2008 в 18:05)
| | Вот еще подумал было бы не плохо перед поиском проверить не равны ли строки Search и Replace и если равны не пускать цикл, иначе получается безконечный цикл... | |
|
|
|
|
|
|
|
для: MHz
(16.10.2008 в 21:24)
| | Все! Вроде бы все идеально! =) Спасибо за помощь! | |
|
|
|
|
автор: анон (27.01.2011 в 18:31) |
|
|
для: MHz
(16.10.2008 в 21:25)
| | char* NewText = (char*)calloc((ResourceLen - SearchLen + ResourceLen), sizeof(char));
вроди надо заменить на char* NewText = (char*)calloc((ResourceLen - SearchLen + ReplaceLen), sizeof(char)); | |
|
|
|
|
автор: анон (27.01.2011 в 18:34) |
|
|
для: анон
(27.01.2011 в 18:31)
| | да и
int ReplaceLen = strlen (Search);
на
int ReplaceLen = strlen (Replace); | |
|
|
|
|
автор: анон (27.01.2011 в 18:48) |
|
|
для: анон
(27.01.2011 в 18:34)
| | окончательный вариант
char* str_replace(char* search, char* replace, char* resource)
{
size_t search_len = strlen(search);
size_t replace_len = strlen(replace);
char* pointer = strstr(resource, search);
while (pointer != NULL)
{
size_t i;
size_t pointer_len = strlen(pointer);
size_t resource_len = strlen(resource);
char* new_text = (char*)calloc((resource_len - search_len + replace_len), sizeof(char));
strncpy(new_text, resource, resource_len - pointer_len);
strcat(new_text, replace);
strcat(new_text, pointer + search_len);
free(resource);
resource = new_text;
pointer = strstr(resource, search);
}
return resource;
} | |
|
|
|
|
|
|
|
для: анон
(27.01.2011 в 18:48)
| | При зацикловке работает некорректно!
+
отсутсвует проверка на вхождение заменяемой подстроки в заменяющую. | |
|
|
|
|
автор: Nokse (08.11.2011 в 01:46) |
|
|
для: анон
(27.01.2011 в 18:31)
| | С учетом этих поправок работать не хотело. натыкалось на строчку Resource = (char*)realloc(Resource, (ResourceLen - SearchLen + ReplaceLen)*sizeof(char));
| и выдавало ошибку доступа к памяти (ацес виолейшн, пардон за мой французский)). После того, как закоментировал эту строку - работает чудесно. По крайней мере, прекрасно заменило прямые слеши на обратные в строке, содержащей адрес папки. | |
|
|
|