Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: C+Explode

Sivun loppuun

tesmu [10.01.2006 12:28:50]

#

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ä.

Baglair [11.01.2006 15:07:41]

#

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?

Meitsi [11.01.2006 15:33:29]

#

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).

tesmu [11.01.2006 16:43:38]

#

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.

Baglair [11.01.2006 17:14:51]

#

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.

tesmu [11.01.2006 17:52:25]

#

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...

Antti Laaksonen [11.01.2006 18:15:02]

#

Määrittele merkkijono näin:

char sana[] = "Omg tässä on hassu sana";

Jos funktio muuten toimii, niin tämä voisi toimia.

tesmu [11.01.2006 18:36:29]

#

No siinähän se on se valittaa jostain typeistä jos toi muuttuja on määritelty muullatavalla kuin char **sana;

Antti Laaksonen [11.01.2006 18:40:19]

#

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.

Metabolix [11.01.2006 20:54:47]

#

#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.

Linkku [11.01.2006 21:17:19]

#

C++:lle, http://mureakuha.com/koodikirjasto/383


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta