[(ansi) C] - funkce ala str_replace

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod iFR3NK 22. 11. 2008 00:39

Dobrý den,
chtěl bych se zeptat zda někdo nevíte o nějaký funkci (nebo jí už máte napsanou), která realizuje nahrazení řetězce v jiném řetězci (ne pouze jednotlivé chary, ale celé "stringy").

Našel jsem na různejch konferách asi 3 metody, ale každá z nich mi prostě někdy selhala. Nechce se mi to psát, protože určitě to už předemnou někdo řešil a určitě vyřešil nějak elegantně a bezpečně ;)

Díky moc za pomoc.
iFR3NK
Junior
Uživatelský avatar

Odeslat příspěvekod wojta 22. 11. 2008 11:54

No kdybys použil nějakou knihovnu jako PCRE (http://www.pcre.org/), tak si s tím můžeš vyhrát celkem dost.
C:\>ver
MS-DOS Version 5.00
wojta
Pokročilý
Uživatelský avatar

Odeslat příspěvekod iFR3NK 22. 11. 2008 14:10

for Wojta:
potřebuju používat jen ansi c knihovny ;) ale díky ;)
iFR3NK
Junior
Uživatelský avatar

Odeslat příspěvekod Xena 22. 11. 2008 14:40

Cus, cece vytah sem to ze svy , uz leta nevyvijeny gamesy, tak za to nerucim :)
Kód: Vybrat vše
static char * _strrepl(const char *orig, const char *find, const char *replace)
{
    const char *loc;
    char *newstr, *temp, *tempstr;
    unsigned int olen, flen, rlen, i;

    if (!orig || !find || !replace )
        return NULL;  /* oops */

    olen = strlen(orig);
    flen = strlen(find);
    rlen = strlen(replace);

    temp = strstr(orig,find);
    if (!temp)
        return NULL;
     /* count up any instances of the string we can find */
    i = 0;
    while (temp)
    { /* advance past current instance and get a count */
         temp += flen;
         i++;
         temp = strstr(temp,find);
     }

    /* allocate a buffer for the new string */
    newstr = (char *) malloc((olen + ((rlen - flen) * i) + 1) * sizeof(char));
    tempstr = newstr;
    loc = orig;

    while((temp = strstr(loc,find))!=NULL)
    { /* copy pieces into the new buffer */
        memcpy(tempstr,loc,(int)(temp - loc));
        tempstr += (int)(temp - loc);

        memcpy(tempstr,replace,rlen);
        tempstr += rlen;

       loc = temp + flen;
    }

    strcpy(tempstr,loc);  /* copy the last piece */


    return newstr;
}
Cry soldier , cry ...
Xena
Junior
Uživatelský avatar

Odeslat příspěvekod iFR3NK 22. 11. 2008 15:48

for Xena:
Ty voe ono to funguje :) díky moc ;)
resp. zatim to funguje, tohle nadšení už jsem zažil i s jinejma algoritmama, ale tohle vypadá zatim odolný proti všem mejm testovacím stringům ;)
iFR3NK
Junior
Uživatelský avatar

Odeslat příspěvekod iFR3NK 22. 11. 2008 19:23

ještě akorát Ti to vrací null, když to nemá co nahradit(už jsem si to opravil), jinak to vypadá fakt OK ;) ještě jednou díky ;)
iFR3NK
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků