#include #include #include #include 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'; }