Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Find/Replace rutina u C-u

[es] :: Vodič za učenje :: Seminarski radovi :: Find/Replace rutina u C-u

[ Pregleda: 3496 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Divine
Miloš Šaković
IT Manager
Yugoslavia

Član broj: 883
Poruke: 108
*.crnagora.net

ICQ: 16044064
Sajt: www.divine.cg.yu


Profil

icon Find/Replace rutina u C-u09.06.2003. u 04:47 - pre 253 meseci
Da li neko ima ideju kako da se odradi jednostavna Find/Replace rutina?
Za seminarski treba da odradim projekat koji ce da otvara fajl, pretrazi trazeni string u fajlu, zamijeni sa replace stringom i upise u fajl.

Ovo ostalo je ok, ali nikako ne mogu da dodjem do dobre i jednostavne funkcije koja ce da odradi upravo find/replace. Produkt mog "truda" je prikljucen uz poruku.
I see dead people...
Prikačeni fajlovi
 
Odgovor na temu

alkal
Aleksandar Kalanj
Beograd

Član broj: 7960
Poruke: 26
*.ptt.yu

Jabber: alkal@elitesecurity.org
Sajt: wapdata.co.cc


Profil

icon Re: Find/Replace rutina u C-u09.06.2003. u 22:10 - pre 253 meseci
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.
 
Odgovor na temu

Divine
Miloš Šaković
IT Manager
Yugoslavia

Član broj: 883
Poruke: 108
*.cg.yu

ICQ: 16044064
Sajt: www.divine.cg.yu


Profil

icon Re: Find/Replace rutina u C-u10.06.2003. u 04:10 - pre 253 meseci
Iskreno se zahvaljujem!
I see dead people...
 
Odgovor na temu

[es] :: Vodič za učenje :: Seminarski radovi :: Find/Replace rutina u C-u

[ Pregleda: 3496 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.