Php has a useful function called str_replace which can search and replace a certain string in another big string. However there is no such function in C. So I wrote up one for myself. Here is the code.
/* * Search and replace a string with another string , in a string * */ char *str_replace(char *search , char *replace , char *subject) { char *p = NULL , *old = NULL , *new_subject = NULL ; int c = 0 , search_size; search_size = strlen(search); //Count how many occurences for(p = strstr(subject , search) ; p != NULL ; p = strstr(p + search_size , search)) { c++; } //Final size c = ( strlen(replace) - search_size )*c + strlen(subject); //New subject with new size new_subject = malloc( c ); //Set it to blank strcpy(new_subject , ""); //The start position old = subject; for(p = strstr(subject , search) ; p != NULL ; p = strstr(p + search_size , search)) { //move ahead and copy some text from original subject , from a certain position strncpy(new_subject + strlen(new_subject) , old , p - old); //move ahead and copy the replacement text strcpy(new_subject + strlen(new_subject) , replace); //The new start position after this search match old = p + search_size; } //Copy the part after the last search match strcpy(new_subject + strlen(new_subject) , old); return new_subject; }
Usage
/* * @brief * PHP's str_replace ported to C * @author Silver Moon ([email protected]) * */ #include<stdio.h> #include<string.h> #include<stdlib.h> char *str_replace(char *search , char *replace , char *subject); int main() { char *a = "allblldddlll"; char *c = str_replace("ll" , "xll" , a); puts(c); return 0; } /* * Search and replace a string with another string , in a string * */ char *str_replace(char *search , char *replace , char *subject) { char *p = NULL , *old = NULL , *new_subject = NULL ; int c = 0 , search_size; search_size = strlen(search); //Count how many occurences for(p = strstr(subject , search) ; p != NULL ; p = strstr(p + search_size , search)) { c++; } //Final size c = ( strlen(replace) - search_size )*c + strlen(subject); //New subject with new size new_subject = malloc( c ); //Set it to blank strcpy(new_subject , ""); //The start position old = subject; for(p = strstr(subject , search) ; p != NULL ; p = strstr(p + search_size , search)) { //move ahead and copy some text from original subject , from a certain position strncpy(new_subject + strlen(new_subject) , old , p - old); //move ahead and copy the replacement text strcpy(new_subject + strlen(new_subject) , replace); //The new start position after this search match old = p + search_size; } //Copy the part after the last search match strcpy(new_subject + strlen(new_subject) , old); return new_subject; }
Output
axllbxlldddxlll
c = ( strlen(replace) – search_size )*c + strlen(subject);
//New subject with new size
new_subject = malloc( c );
Hallo
This source is listed in Google so please correct
If replace is shorter then search you get a negativ size –> segfault
Check for nothing to replace.
Free the old subject.
By the way, i think strcat is easier then the strncpy way.
Jürgen
Thanks for the function.
Buf we need insert this new_subject[p-old] = ”; in line 53 and new_subject[c][/c]=”; in line 63
why do we need to insert that. inserting new_subject=” in line 63 will erase the new string.