Re: Best way to find and replace substrings in a char buffer?
Dynamic allocation of the buffer is harder because the size is not known in
advance, unless you first count the number of occurrences and multiply it
with the difference in length of the string to be found and the one used for
replacement.
This is how dynamic allocation can be done. I haven't testet this
carefully, so there might be errors in calculating needed size for new
buffer, but you'll get the idea
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <assert.h>
#define CHECK_BUFFER(buffer,capacity,length,append_length) \
if ( (length) + (append_length) > (capacity)) { \
printf("Buffer Capacity %d is not enought for %d\n", (capacity),
(length) + (append_length));\
capacity = (capacity)*2 > (length) + (append_length) ?
(capacity*2) : (length) + 2*(append_length);\
printf("New Capacity is %d\n", (capacity));\
buffer = (char*)realloc(buffer, (capacity)); \
assert(buffer!=NULL);\
}
char *replace_str(char *str, char *orig, char *rep)
{
int buffer_capacity = 10;
int buffer_length = 0;
char* buffer = (char*)malloc(sizeof(char)*buffer_capacity);
buffer[0] = '\0';
char *p;
char *begin = str; //points on the beginning of string
int origLen = strlen(orig);
int rep_length = strlen(rep);
while ( p = strstr(begin, orig))
{
CHECK_BUFFER(buffer, buffer_capacity, buffer_length, p-begin);
strncat(buffer, begin, p-begin);
buffer_length+=(p-begin);
CHECK_BUFFER(buffer, buffer_capacity, buffer_length, rep_length);
strcat(buffer, rep);
buffer_length+=rep_length;
begin = p+origLen;
}
CHECK_BUFFER(buffer, buffer_capacity, buffer_length, strlen(str) -
(begin - str));
strncat(buffer, begin, strlen(str) - (begin - str));
//ATTENTION : buffer is not freed!!!
return buffer;
}
int main()
{
char * str = replace_str("Hello, world!", "world", "Miami");
puts(str);
free(str);// not that wierd as it might look like,
// strdup for example also returns buffer that must be freed
return 0;
}
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]