Karakter sorozat minta csereje C-ben

 ( tast | 2004. október 14., csütörtök - 10:07 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A kovetkezo prolemara kellene nekem valami egyszeru megoldas:

Van egy stringem pl. "{B}abc". Ebben a stringben kellene lecserelni a {B} reszt egy megadott masik stringre. Van erre valami C konyvtari fuggveny?
Valami olyasmi kellene mint a vi-ban a %s/{B}/d/g

Nem tudok róla hogy lenne ilyen fgv, de már abbahagytam a c-t mióta a Python-t megismertem. De azért nem vészes egy ilyet megírni.

Az strstr() fgv-t használhatod arra, hogy megkeress egy sztringet egy másikban. Innentől csak az a dolgod, hogy egy ciklusban megkeresgeted a keresett sztringet, és a nem illeszkedő részeket + azt a sztringet amire cserélni akarod, azt egy másik sztringbe írod, megfelelő sorrendben persze.
Persze a string az char* :) Ja, és a fenti fgv a string.h-ban van. Ami kellhet még az strcat hozzáfűzni meg strcpy lenullázni a stringet. De mondom, már évek óta nem néztem rá a c-re sajna :)

Én az strtok () függvénynek javaslom utánanézni. Feldarabol egy sztringet egy másik sztring, mint tokenek alapján. (Kb. mint a perl split, csak nem regexpet eszik, csak sima sztringet.)

Babszem.

[code:1:f1a48fb651]
/* strstr example */
#include <stdio.h>
#include <string.h>

int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
strncpy (pch,"sample",5);
puts (str);
return 0;
}
[/code:1:f1a48fb651]

Egy pelda a netrol.
www.cplusplus.com

En meg javaslom, hogy amit irtam meg se nezd...
Pihenek meg egy kicsit inkabb, mert elszegyeltem magam.

[quote:a9b4108ed4="SDN"]En meg javaslom, hogy amit irtam meg se nezd...
Pihenek meg egy kicsit inkabb, mert elszegyeltem magam.[/quote:a9b4108ed4]

Miert mi ezzel a baj?

Hat peldanak jo, de nem hasznalnam olyan helyen, ahol esetleg malicious user is megfordul. Arrol nem is beszelve, hogy a felulirasnal csak 5 char-t ir felul, pedig a "sample" 6 charbol all. (Mondjuk ugyugy e beture cserelne, ezert ez egy tipikus latens hiba. Tovabba a c-ben kevesbe jaratosak szamara pedig megjegyzem, hogy a "sample" string valojaban 7 char, mert a vegen van egy \0 terminalo karakter is, de ezt most szandekosan nem masoljuk at.)
Emellett rettentoen elhanyagolja azt az esetet, hogyha nem egyforma hosszu az eredeti es az uj resz, kulonos tekintettel arra, hogyha az uj string tullog az eredeti teljes string vegen. (puffer tuliras)

[quote:9b4c384314="XMI"]Emellett rettentoen elhanyagolja azt az esetet, hogyha nem egyforma hosszu az eredeti es az uj resz, kulonos tekintettel arra, hogyha az uj string tullog az eredeti teljes string vegen. (puffer tuliras)[/quote:9b4c384314]

Ertem en. Engem az erdekelt volna, hogy eseteleg nincs-e egy olyan konyvtari fuggveny amely kb igy nezne ki:

newStr = strreplace("This is a {B} string","{B}", "sample");

Igy newStr-kent "This is a sample string" - et kapok

Valami ilyesmi kell?

A csere() nem ellenorzi, hogy a buffer eleg nagy-e az uj string tarolasara, ezt esetleg javitsd ki.

[code:1:132fa308d8]
#include <stdio.h>
#include <string.h>

// nem ellenorzi a buffer hosszat!
void csere(char *buffer, const char *s, const char *mit, const char *mire)
{
const char *start = s;
const char *next;

buffer[0] = '\0';

while ((next=strstr(start, mit)) != NULL)
{
strncat(buffer, start, next - start);
strcat(buffer, mire);
start = next + strlen(mit);
}
}

int main(void)
{
char buffer[1024];

csere(buffer, "{B} <- ez az elso, ez a masodik: {B}", "{B}", "beeee");

printf("'%s'\n", buffer);
}
[/code:1:132fa308d8]

[quote:ad98f9b0e1="Kenny"]Valami ilyesmi kell?

A csere() nem ellenorzi, hogy a buffer eleg nagy-e az uj string tarolasara, ezt esetleg javitsd ki.

[/quote:ad98f9b0e1]

Koszonom!

Tokeletes.

[quote:7b4fdecbb4]

Koszonom!

Tokeletes.[/quote:7b4fdecbb4]

Fraszkarikat tokeletes :)))

A fuggveny vegere ird oda, hogy
[code:1:7b4fdecbb4]
if (*start)
strcat(buffer, start);
[/code:1:7b4fdecbb4]

Kulonben csak akkor mukodik jol, ha a szoveg vege {B}