#include #include /****************************************************************************/ char /* */ *palanen( /* Osoitin merkkijonon palaseen. */ char *jono ,/* s P„tkitt„v„ jono, turmeltuu! */ char *erottimet ,/* s Merkit joiden kohdalta katkaistaan. */ int *jaljella /* t Paljonko jonoa on viel„ j„ljell„ (-1 loppu)*/ ) /* ** Funktiolla p„tkit„„n merkkijonoa osiin. 1. kutsukerralla v„litet„„n ** tutkittava jono ja t„m„n j„lkeen seuraavilla NULL osoitin. ** Funktio vaihtaa l”yt„m„ns„ erotinmerkit null-merkeiksi! ** ** Muuttuu: jono ** Algoritmi: ** Esimerkki: 012345678901234 ** jono="Aku|Ankka||12" erottimet="|" ** 1. kutsu palanen(jono,"|",&j) -> "Aku" , j=10 ** 2. kutsu palanen(NULL,"|",&j) -> "Ankka", j=4 ** 3. kutsu palanen(NULL,"|",&j) -> "" , j=3 ** 4. kutsu palanen(NULL,"|",&j) -> "12" , j=0 ** 5. kutsu palanen(NULL,"|",&j) -> "" , j=-1 ----------------------------------------------------------------------------*/ { static char *st=""; static int p1=0,p2=0,pit=0; if (jono) { /* 1. kutsukerta, alustetaan apumuuttujat */ st = jono; pit = strlen(jono); p1 = 0; } else p1 = p2+1; /* Muilla kerroilla jatketaan siit„ mihin viim. j„„tiin. */ if ( p1 > pit ) { *jaljella = -1; return st+pit; /* Tyhj„ merkkijono, kun osoitetaan jonon null-tavuun. */ } p2 = p1+strcspn(st+p1,erottimet); st[p2] = 0; *jaljella = pit-p2; return st+p1; } int main(void) { char jono[]="Aku|Ankka||12", erottimet[]="|"; char *p; int j; p = palanen(jono,erottimet,&j); printf("%s\n",p); while (j>1) { p = palanen(NULL,erottimet,&j); printf("%s\n",p); } return 0; }