rendered paste body#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void check_replace(const char *src, const char *key, const char *replacement, size_t resultsize);
static void replace(const char *src, const char *key, const char *replacement, char *result, size_t resultsize);
int main(int argc, char *argv[]);
int main(int argc, char *argv[])
{
/* destination string too small */
check_replace("abcdefgh", "def", "ghij", 8);
check_replace("abcdefgh", "def", "", 100);
check_replace("abcdefgh", "", "#", 100);
check_replace("abcdefgh", "", "", 100);
check_replace("source string to be replaced--e e r r", "e r", "xxxx", 100);
return(EXIT_SUCCESS);
}
static void check_replace(const char *src, const char *key, const char *replacement, size_t resultsize)
{
char result[256];
assert(resultsize+1 <= sizeof(result));
replace(src, key, replacement, result, resultsize+1);
printf("replace(src=%s, key=%s, replacement=%s)=%s\n", src, key, replacement, result);
}
/**
* Replace in string src all occurrences of key by replacement. The resulting
* string is put into result; at most resultsize characters (including the
* terminating null character) will be written to result.
*/
static void replace(const char *src, const char *key, const char *replacement, char *result, size_t resultsize)
{
size_t resultlen;
size_t keylen;
assert(resultsize > 0);
/* special case to prevent infinite loop if key==replacement=="" */
if(strcmp(key, replacement) == 0)
{
snprintf(result, resultsize, "%s", src);
return;
}
keylen = strlen(key);
resultlen = 0;
while(*src != '\0' && resultlen+1 < resultsize)
{
if(strncmp(src, key, keylen) == 0)
{
snprintf(result+resultlen, resultsize-resultlen, "%s", replacement);
resultlen += strlen(result+resultlen);
src += keylen;
}
else
{
result[resultlen++] = *src++;
}
}
result[resultlen] = '\0';
}