codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
char *strrstr(char *str, char *substr, char *restr) { int n, i, len, sublen, relen; char **pps; //array of pointers to occurrences of substr in str len = strlen(str); relen = strlen(restr); sublen = strlen(substr); if (sublen == 0) return(strdup(str)); pps = (char **)malloc(sizeof(char *) * len / sublen);//max possible size char *pin, *pc = str; n = 0; while (*pc != 0){ //find the occurrences pin = strstr(pc, substr); if (pin != 0){ pps[n++] = pin; pc = pin + sublen; } else break; } //now know how big to make output string int outlen = len + n * (relen - sublen); char *outstr = (char *)malloc(outlen + 1); outstr[outlen] = 0; char *pco = outstr; pc = str; //go along input str for (i = 0; i < n; ++i){ //each occurrence of substr while (*pc != 0 && pc < pps[i])//copy str to outstr until occurrence *pco++ = *pc++; strcpy(pco, restr); //copy replacement string pc += sublen; //skip substring in input pco += relen; //skip replacement in output } while (*pc != 0) //copy str to outstr after last occurrence *pco++ = *pc++; free(pps); return(outstr); } int main(int argc, char **argv) { int len = 100000; char *pa = "a"; char *pb = "b"; char * str = (char *)malloc(len + 1); memset(str, 'a', len); str[len] = 0; char *outstr = strrstr(str, pa, pb); str[41] = 0; puts(str); puts(str + len - 40); outstr[41] = 0; puts(outstr); puts(outstr + len - 40); free(str); free(outstr); return(0); }
Private
[
?
]
Run code
Submit