#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *strreplace(char * string, char * sub, char * replace);
int main(void){
char * mystring = "Here is my string.";
char * sub = " ";
char * replace = "__++";
char * newString = strreplace(mystring, sub, replace);
printf("new string: %s\n", newString
); return 0;
}
//my replace
char *strreplace(char *string, char *sub, char *replace)
{
if(!string || !sub || !replace) return NULL; // we need all inputs
char *result
= (char*)malloc(1); // malloc memory for new string, will be realloc later if(result == NULL){
printf("malloc returned null\n"); return NULL;
}
char *pos = string; // set pointer of pos to start of string
char *pos1; // pointer to search for sub
while((pos1
= strstr(pos
, sub
))) // search for sub and point to start of memory location {
int len = (pos1 - pos); // length = found memory locatino - beginning of string
result
= realloc(result
, len
+ strlen(replace
) + 1); // realloc result for string + replacemenet string + \0
strncat(result
, pos
, len
); // pull up to this location strcat(result
, replace
); //replace the found (strcat is fine because we already allocated the memory) pos
= (pos1
+ strlen(sub
)); // update pos to find next occurance of sub in string }
// if we aren't at the end of the original string, we need to get what's left of original string
if(pos
!= (string
+ strlen(string
))) {
result
= realloc(result
, strlen(result
) + strlen(pos
) + 1); // realloc for what is left of original string strcat(result
, pos
); // get the rest of the original string }
return result; // return new string
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKCmNoYXIgKnN0cnJlcGxhY2UoY2hhciAqIHN0cmluZywgY2hhciAqIHN1YiwgY2hhciAqIHJlcGxhY2UpOwoKaW50IG1haW4odm9pZCl7CiAgICBjaGFyICogbXlzdHJpbmcgPSAiSGVyZSBpcyBteSBzdHJpbmcuIjsKCWNoYXIgKiBzdWIgPSAiICI7CgljaGFyICogcmVwbGFjZSA9ICJfXysrIjsKCgljaGFyICogbmV3U3RyaW5nID0gc3RycmVwbGFjZShteXN0cmluZywgc3ViLCByZXBsYWNlKTsKCXByaW50ZigibmV3IHN0cmluZzogJXNcbiIsIG5ld1N0cmluZyk7CglyZXR1cm4gMDsKfQoKLy9teSByZXBsYWNlCmNoYXIgKnN0cnJlcGxhY2UoY2hhciAqc3RyaW5nLCBjaGFyICpzdWIsIGNoYXIgKnJlcGxhY2UpCnsKCWlmKCFzdHJpbmcgfHwgIXN1YiB8fCAhcmVwbGFjZSkgcmV0dXJuIE5VTEw7IC8vIHdlIG5lZWQgYWxsIGlucHV0cwoKCWNoYXIgKnJlc3VsdCA9IChjaGFyKiltYWxsb2MoMSk7IC8vIG1hbGxvYyBtZW1vcnkgZm9yIG5ldyBzdHJpbmcsIHdpbGwgYmUgcmVhbGxvYyBsYXRlcgoJaWYocmVzdWx0ID09IE5VTEwpewoJCXByaW50ZigibWFsbG9jIHJldHVybmVkIG51bGxcbiIpOwoJCXJldHVybiBOVUxMOwoJfQoJCgljaGFyICpwb3MgPSBzdHJpbmc7IC8vIHNldCBwb2ludGVyIG9mIHBvcyB0byBzdGFydCBvZiBzdHJpbmcKCWNoYXIgKnBvczE7IC8vIHBvaW50ZXIgdG8gc2VhcmNoIGZvciBzdWIKCXdoaWxlKChwb3MxID0gc3Ryc3RyKHBvcywgc3ViKSkpIC8vIHNlYXJjaCBmb3Igc3ViIGFuZCBwb2ludCB0byBzdGFydCBvZiBtZW1vcnkgbG9jYXRpb24KCXsgCiAgICAgICAgaW50IGxlbiA9IChwb3MxIC0gcG9zKTsgLy8gbGVuZ3RoID0gZm91bmQgbWVtb3J5IGxvY2F0aW5vIC0gYmVnaW5uaW5nIG9mIHN0cmluZwoJCXJlc3VsdCA9IHJlYWxsb2MocmVzdWx0LCBsZW4gKyBzdHJsZW4ocmVwbGFjZSkgKyAxKTsgLy8gcmVhbGxvYyByZXN1bHQgZm9yIHN0cmluZyArIHJlcGxhY2VtZW5ldCBzdHJpbmcgKyBcMAoKICAgICAgICBzdHJuY2F0KHJlc3VsdCwgcG9zLCBsZW4pOyAvLyBwdWxsIHVwIHRvIHRoaXMgbG9jYXRpb24KICAgICAgICBzdHJjYXQocmVzdWx0LCByZXBsYWNlKTsgLy9yZXBsYWNlIHRoZSBmb3VuZCAoc3RyY2F0IGlzIGZpbmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGFsbG9jYXRlZCB0aGUgbWVtb3J5KQogICAgICAgIHBvcyA9IChwb3MxICsgc3RybGVuKHN1YikpOyAvLyB1cGRhdGUgcG9zIHRvIGZpbmQgbmV4dCBvY2N1cmFuY2Ugb2Ygc3ViIGluIHN0cmluZwoJfQoKCS8vIGlmIHdlIGFyZW4ndCBhdCB0aGUgZW5kIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHdoYXQncyBsZWZ0IG9mIG9yaWdpbmFsIHN0cmluZwoJaWYocG9zICE9IChzdHJpbmcgKyBzdHJsZW4oc3RyaW5nKSkpCgl7CgkJcmVzdWx0ID0gcmVhbGxvYyhyZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgc3RybGVuKHBvcykgKyAxKTsgLy8gcmVhbGxvYyBmb3Igd2hhdCBpcyBsZWZ0IG9mIG9yaWdpbmFsIHN0cmluZwoJCXN0cmNhdChyZXN1bHQsIHBvcyk7IC8vIGdldCB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nCgl9CgkKCglyZXR1cm4gcmVzdWx0OyAvLyByZXR1cm4gbmV3IHN0cmluZwp9