Priložena fukcija zamjenjuje svaku pojavu traženog stringa.
Code:
#include <stdio.h>
#include <string.h>
void search_and_replace (const char *text, char *new_text, const char *find, const char *replace) {
char *found;
int len_find = strlen (find),
len_replace = strlen (replace),
len_text = strlen (text);
int i=0, j=0; /* Iteratori kroz ulazni i izlazni tekst. */
found = strstr (text, find); /* Pronadji prvu pojavu trazenog stringa u tekstu. */
while (i <= len_text) {
if ( found != text + i ) {
new_text[j] = text[i];
i++;
j++;
} else {
/* strcat() dopisuje 'replace' string nakon terminatora u 'new_text': */
strcat (new_text, replace);
i += len_find;
j += len_replace;
found = strstr (text + i, find); /* Pronadji narednu pojavu trazenog stringa. */
}
new_text[j] = '\0'; /* U svakoj iteraciji se dopisuje terminator na kraj. */
}
}
main () {
char tekst1[] = "Ja sam jedan car, a svi carevi moraju dobro da jedu.";
char tekst2[100];
search_and_replace (tekst1, tekst2, "car", "kralj");
printf ("%s\n%s\n", tekst1, tekst2);
}
Napisao sam je ne vodeći računa o mogućnosti "prelivanja" izlaznog stringa.
Znači ako deklarišeš izlazni string sa text[10], a izlazni tekst bude veći - funkcija će brljati po memoriji.
Ovo nije naročito opasno, samo rezerviši dovoljno memorijskog prostora prije poziva funkcije.
A ako baš hoćeš možeš i da je prepraviš tako što će primati jedan više argument:
Code:
void search_and_replace (const char *text, char *new_text, const char *find, const char *replace, int max_size);
Fukcija strstr(str1, str2) vraća pokazivač na prvu pojavu stringa str2 unutar stringa str1.
U slučaju da se traženi string ne pojavljuje, vraća se prazan pokazivač - NULL.