Elikkäs mistä löytäisin C kielelle kirjaston jossa olisi PHPeen explodea vastaava funktio ja sitten jos joku pistää linkin niin hieman ohjeita funktion käytöstä.
Millainen se PHP:n explode
on sitten kun niitä funktioita voi tehdä itse ja vieläpä niistä voi vaikka koota oman kirjaston
EDIT: Pienellä googletuksella sain kuvan, että explode toimisi jotenkin näin; skannaa rivin tekstiä ja erottelee ne eri stringeihin katkaisumerkin mukaan. Olenko oikeassa?
Explode palauttaa taulukon, jossa on parametrinä annettu stringi halkaistuna parametrinä annetun merkin kohdilta.
Tuommoisenhan voi koodata itsekin. Lukee loopissa char-taulua ja lisäilee merkkejä taulukon alkioon. Kun vastaan tulee määritetty katkaisumerkki, siirrytään temp-taulussa seuraavaan alkioon (taulukon oltava dynaaminen, tässävaiheessa reallocataan taulu isommaksi).
elikkäs löysin tuollaisen kirjaston joka sisältää tällätavalla
tiedoston nimi on strfunc.h
siirsin sen /usr/include kansioon
ja itse kirjasto
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> char **explode (char *string, char *delimiter){ char **array, *tmp; int i = 0; int j = 0; int lend = strlen(delimiter); array = malloc (sizeof(char *) * countstr(string, delimiter)); tmp = strdup (string); array[0]= tmp; while (tmp[i]) { if (!strncmp(&tmp[i], delimiter, lend)){ tmp[i] = '\0'; i += lend; array[++j] = tmp + i; } else i++; } return array;
ja käytän tuota kirjastoa tälleen
#include <string.h> #include <strfunc.h> #include <stdio.h> int main(void) { char **ar; char sana="Omg tässä on hassu sana"; ar = explode(sana," "); if (!strcmp(ar[0],"Omg") { ja tavaraa } }
noh tämä aiheuttaa puskuri ylivuodon mistä tämä johtuu?
Mod. Edit tagit lisätty.
Vähän vaikeaselkoista tuo koodi. Voisit vissiin käyttää kooditageja ks. Ohjeet. Niin ja niitä kommentteja tonne väliin.
Siirrytäänpä nyt ihan itse onglemaan eli ei sinun tarvitse muuta tehdä, kuin tehdä tuo explode funktio. Se kannattaa sisällyttää itse ohjelmaan, ellei sinulla ole jotain muita mutkikkaita funktioita jolloin voit koota niistä oman kirjaston.
Jos siis sisällytät tuon explode funktion ohjelmaasi siitä tulisi suurinpirtein tämän näköinen:
#include <stdio.h> //Funktion esittely int explode(määritteet); int main(void) { ... } int explode(määritteet) { ... }
Niin ja voisit vähän kertoa tuosta explode
funktiosta millainen siitä pitäisi tulla. Tarkoitan siis pitäisikö sen pystyä lukemaan esim. tekstitiedoston tietyltä riviltä rivi ja erotella sanat omaan taulukkoon vai kenties erotella käyttäjän syöttämät sanat ja kirjata ne tekstitiedostoon.
No siis explode = räjäyttää.
Eli tuo erottelee esim lauseesta tiettyjen merkkien väleiltä taulukkoon tekstiä. Esim.
"moicca jee joo omg"
Erotellaan " " merkkien väliltä taulukkoon moi
niin
moi[0] = moicca
moi[1] = jee
jne jne...
Määrittele merkkijono näin:
char sana[] = "Omg tässä on hassu sana";
Jos funktio muuten toimii, niin tämä voisi toimia.
No siinähän se on se valittaa jostain typeistä jos toi muuttuja on määritelty muullatavalla kuin char **sana;
Oletko nyt aivan varma? Minulla tuo funktio toimi tuolla muutoksella. Muuttuja sana on pelkkä yksittäinen merkkijono, ja siksi siihen pitäisi riittää char-taulukko.
#include <stdio.h> #include <string.h> int explode(char ** teksti, char * erottaja, int max) { int i, len; char * pos; // Erottajan pituus len = strlen(erottaja); for (i = 1; i < max; ++i) { // Etsitään edellisestä rivistä katkaisukohta pos = strstr(teksti[i - 1], erottaja); // Jos ei löydy, poistutaan jo if (pos == NULL) return i; // Laitetaan tähän kohti 0-merkki pos[0] = 0; // Laitetaan seuraavan alku kohdalleen teksti[i] = &(pos[len]); // Jos tähän loppuu koko teksti, ei lasketa tätä vaan lopetetaan if (pos[len] == 0) return i; } return i; } int main(void) { char teksti[] = "Matti...Maija...Pikku-Jukka...Taavi..."; char *tek[6] = { teksti,0,0,0,0,0 }; int Teksteja = 6; // Hajotetaan ja otetaan löytynyt määrä ylös Teksteja = explode((char **)tek, "...", Teksteja); // Printataan for (int i = 0; i < Teksteja; i++) { printf("%i) %s\n", (i+1), tek[i]); } return 0; }
Ongelmaksi tuossa nousee se, että jos tekstin määrittelee väärin (esim. kirjoittaa suoraan moniulotteiseen tauluun), se tahtoo kääntäessä tulla vakioksi, ja ohjelma kaatuu, kun siihen yrittää kirjoittaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.