#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <memory.h>
char * replacecstr(char *str, char*substri, char* replacement);
/* Here is algorithmic overview.
1. Copy byte by byte
2. If possible substring-start is found, stop copying, note position
3. If substring match continues, continue comparing;
3.1 If it fails to match the substring, put us back just after we thought it was a substring
3.2 If the substring is a match, write the replacement instead
4. Else, goto 1
*/
char * replacecstr(char *str, char*substri, char* replacement)
{
enum states { searching, possible };
char *substr = substri;
char *curptr = str;
char *possible_start = str;
char *first_malloc = (char*)malloc(strlen(str)*10);
char *writepos = first_malloc;
states status = searching;
for (;;) {
// **** This part checks if we're at the end of the string, and handles corner-cases
if (*curptr == 0) { // End of input string
if (status==possible) { // If we thought we might be in a substring...are we?
if (*substr == 0) { // We've matched our substring with our string right at the end, the corner case, so do our replacement
char *tmp = replacement;
while(*tmp!=0) {
*writepos = *tmp;
writepos++;
tmp++;
}
}
else { // We thought we were in a substring but we're not, so we need to copy what we missed
while (*possible_start) {
*writepos = *possible_start;
possible_start++;
writepos++;
}
}
}
break; // We're at the end no matter what, so get out of this loop
}
// **** This part covers what to do when we think we're in a substring
if (status==possible) {
if (*substr == 0) // Reached end of substring, found a match!
{
status = searching;
char *tmp = replacement;
while(*tmp!=0) {
*writepos = *tmp;
writepos++;
tmp++;
}
substr = substri;
continue;
}
else if (*curptr!=*substr) { // Substring doesn't match, time to go back to just after the possible start to see if we have a substring
status = searching;
curptr = possible_start + 1;
*writepos = *possible_start;
writepos++;
substr = substri;
continue;
}
else { // Just another part of the substring
curptr++;
substr++;
continue;
}
}
// **** This part checks if we have a possible start to the sub-string
if (*curptr==*substr) {
status = possible;
possible_start = curptr;
curptr++;
substr++;
continue;
}
// **** Thos part continues the byte-by-byte copy
*writepos = *curptr;
writepos++;
curptr++;
}
*writepos = 0;
int tcpy = strlen(first_malloc)+1;
char *malloc2 = (char *)malloc(tcpy);
memcpy(malloc2,first_malloc,tcpy);
free(first_malloc);
return malloc2;
}
int main()
{
char *foo = replacecstr("Hello bob how bbob are you","bob","ann");
std::cout << foo;
free(foo);
char foobarre[500];
gets(foobarre);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxtZW1vcnkuaD4KCmNoYXIgKiByZXBsYWNlY3N0cihjaGFyICpzdHIsIGNoYXIqc3Vic3RyaSwgY2hhciogcmVwbGFjZW1lbnQpOwoKLyogSGVyZSBpcyBhbGdvcml0aG1pYyBvdmVydmlldy4KICAgIDEuIENvcHkgYnl0ZSBieSBieXRlCgkyLiBJZiBwb3NzaWJsZSBzdWJzdHJpbmctc3RhcnQgaXMgZm91bmQsIHN0b3AgY29weWluZywgbm90ZSBwb3NpdGlvbgoJMy4gSWYgc3Vic3RyaW5nIG1hdGNoIGNvbnRpbnVlcywgY29udGludWUgY29tcGFyaW5nOwoJIDMuMSBJZiBpdCBmYWlscyB0byBtYXRjaCB0aGUgc3Vic3RyaW5nLCBwdXQgdXMgYmFjayBqdXN0IGFmdGVyIHdlIHRob3VnaHQgaXQgd2FzIGEgc3Vic3RyaW5nCgkgMy4yIElmIHRoZSBzdWJzdHJpbmcgaXMgYSBtYXRjaCwgd3JpdGUgdGhlIHJlcGxhY2VtZW50IGluc3RlYWQKCTQuIEVsc2UsIGdvdG8gMQoJKi8KCmNoYXIgKiByZXBsYWNlY3N0cihjaGFyICpzdHIsIGNoYXIqc3Vic3RyaSwgY2hhciogcmVwbGFjZW1lbnQpCnsKCWVudW0gc3RhdGVzIHsgc2VhcmNoaW5nLCBwb3NzaWJsZSB9OwoKICAgIGNoYXIgKnN1YnN0ciA9IHN1YnN0cmk7CgljaGFyICpjdXJwdHIgPSBzdHI7CgljaGFyICpwb3NzaWJsZV9zdGFydCA9IHN0cjsKCgljaGFyICpmaXJzdF9tYWxsb2MgPSAoY2hhciopbWFsbG9jKHN0cmxlbihzdHIpKjEwKTsKCgljaGFyICp3cml0ZXBvcyA9IGZpcnN0X21hbGxvYzsKCXN0YXRlcyBzdGF0dXMgPSBzZWFyY2hpbmc7Cglmb3IgKDs7KSB7CgogICAgICAgIC8vICoqKiogVGhpcyBwYXJ0IGNoZWNrcyBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIGFuZCBoYW5kbGVzIGNvcm5lci1jYXNlcwoJCWlmICgqY3VycHRyID09IDApIHsgLy8gRW5kIG9mIGlucHV0IHN0cmluZwoJCQlpZiAoc3RhdHVzPT1wb3NzaWJsZSkgeyAvLyBJZiB3ZSB0aG91Z2h0IHdlIG1pZ2h0IGJlIGluIGEgc3Vic3RyaW5nLi4uYXJlIHdlPwoJCQkgICAgaWYgKCpzdWJzdHIgPT0gMCkgeyAvLyBXZSd2ZSBtYXRjaGVkIG91ciBzdWJzdHJpbmcgd2l0aCBvdXIgc3RyaW5nIHJpZ2h0IGF0IHRoZSBlbmQsIHRoZSBjb3JuZXIgY2FzZSwgc28gZG8gb3VyIHJlcGxhY2VtZW50CgkJCQkJY2hhciAqdG1wID0gcmVwbGFjZW1lbnQ7CgkJCQkJd2hpbGUoKnRtcCE9MCkgewoJCQkJCSAgICAqd3JpdGVwb3MgPSAqdG1wOwoJCQkJCQl3cml0ZXBvcysrOwoJCQkJCQl0bXArKzsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIHsgLy8gV2UgdGhvdWdodCB3ZSB3ZXJlIGluIGEgc3Vic3RyaW5nIGJ1dCB3ZSdyZSBub3QsIHNvIHdlIG5lZWQgdG8gY29weSB3aGF0IHdlIG1pc3NlZAoJCQkJCXdoaWxlICgqcG9zc2libGVfc3RhcnQpIHsKCQkJCQkJKndyaXRlcG9zID0gKnBvc3NpYmxlX3N0YXJ0OwoJCQkJCQlwb3NzaWJsZV9zdGFydCsrOwoJCQkJCQl3cml0ZXBvcysrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlicmVhazsgLy8gV2UncmUgYXQgdGhlIGVuZCBubyBtYXR0ZXIgd2hhdCwgc28gZ2V0IG91dCBvZiB0aGlzIGxvb3AKCQl9CgoJCS8vICoqKiogVGhpcyBwYXJ0IGNvdmVycyB3aGF0IHRvIGRvIHdoZW4gd2UgdGhpbmsgd2UncmUgaW4gYSBzdWJzdHJpbmcKCSAgICBpZiAoc3RhdHVzPT1wb3NzaWJsZSkgewoJCQlpZiAoKnN1YnN0ciA9PSAwKSAvLyBSZWFjaGVkIGVuZCBvZiBzdWJzdHJpbmcsIGZvdW5kIGEgbWF0Y2ghCgkJCXsKCQkJCXN0YXR1cyA9IHNlYXJjaGluZzsKCQkJCWNoYXIgKnRtcCA9IHJlcGxhY2VtZW50OwoJCQkJd2hpbGUoKnRtcCE9MCkgewoJCQkJICAgICp3cml0ZXBvcyA9ICp0bXA7CgkJCQkJd3JpdGVwb3MrKzsKCQkJCQl0bXArKzsKCQkJCX0KCQkJCXN1YnN0ciA9IHN1YnN0cmk7CgkJCQljb250aW51ZTsKCQkJfQoJCQllbHNlIGlmICgqY3VycHRyIT0qc3Vic3RyKSB7IC8vIFN1YnN0cmluZyBkb2Vzbid0IG1hdGNoLCB0aW1lIHRvIGdvIGJhY2sgdG8ganVzdCBhZnRlciB0aGUgcG9zc2libGUgc3RhcnQgdG8gc2VlIGlmIHdlIGhhdmUgYSBzdWJzdHJpbmcKCgkJCQlzdGF0dXMgPSBzZWFyY2hpbmc7CgkJCQljdXJwdHIgPSBwb3NzaWJsZV9zdGFydCArIDE7CgkJCQkqd3JpdGVwb3MgPSAqcG9zc2libGVfc3RhcnQ7CgkJCQl3cml0ZXBvcysrOwoJCQkJc3Vic3RyID0gc3Vic3RyaTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWVsc2UgeyAvLyBKdXN0IGFub3RoZXIgcGFydCBvZiB0aGUgc3Vic3RyaW5nCgkJCQljdXJwdHIrKzsKCQkJCXN1YnN0cisrOwoJCQkJY29udGludWU7CgkJCX0KCQl9CgoJCS8vICoqKiogVGhpcyBwYXJ0IGNoZWNrcyBpZiB3ZSBoYXZlIGEgcG9zc2libGUgc3RhcnQgdG8gdGhlIHN1Yi1zdHJpbmcKCQlpZiAoKmN1cnB0cj09KnN1YnN0cikgewoJCQlzdGF0dXMgPSBwb3NzaWJsZTsKCQkJcG9zc2libGVfc3RhcnQgPSBjdXJwdHI7CgkJCWN1cnB0cisrOwoJCQlzdWJzdHIrKzsKCQkJY29udGludWU7CgkJfQoKCQkvLyAqKioqIFRob3MgcGFydCBjb250aW51ZXMgdGhlIGJ5dGUtYnktYnl0ZSBjb3B5CgkJKndyaXRlcG9zID0gKmN1cnB0cjsKCQl3cml0ZXBvcysrOwoJCWN1cnB0cisrOwoJfQoKCSp3cml0ZXBvcyA9IDA7CgoJaW50IHRjcHkgPSBzdHJsZW4oZmlyc3RfbWFsbG9jKSsxOwoJY2hhciAqbWFsbG9jMiA9IChjaGFyICopbWFsbG9jKHRjcHkpOwoJbWVtY3B5KG1hbGxvYzIsZmlyc3RfbWFsbG9jLHRjcHkpOwoJZnJlZShmaXJzdF9tYWxsb2MpOwoJcmV0dXJuIG1hbGxvYzI7Cn0KCgppbnQgbWFpbigpCnsKCWNoYXIgKmZvbyA9IHJlcGxhY2Vjc3RyKCJIZWxsbyBib2IgaG93IGJib2IgYXJlIHlvdSIsImJvYiIsImFubiIpOwoJc3RkOjpjb3V0IDw8IGZvbzsKCWZyZWUoZm9vKTsKCgljaGFyIGZvb2JhcnJlWzUwMF07CglnZXRzKGZvb2JhcnJlKTsKfQ==