Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa strtok funkcijom

[es] :: C/C++ programiranje :: Problem sa strtok funkcijom

[ Pregleda: 2061 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

lejlaz
Lejla Zaimovic
Student
Podgorica

Član broj: 224484
Poruke: 16
77.222.22.*



Profil

icon Problem sa strtok funkcijom04.06.2009. u 12:13 - pre 180 meseci
imam sledeci problem:
fjiji obradi_string prosledjujem recenicu linija[], iz koje treba vaditi rijec po rijec i svaku posebno treba obradjivati kroz sledece linije koda:
r4=nova_rijec(a,kat);
*l4=dodaj_lista_rijeci(r4,*l4);
Sa strtok dobro mi izdvoji samo prvu rijec u recenici, a posle cita neke cudne karaktere a ne sledecu rijec.

Moze li mo ko pomoci oko ovoga?
Code:

void obradi_string(char linija[130],char kat[20], lista_rijeci  * l4)
 {
    rijec r4;
    const char delimiteri[40]=" !@#$%^&*()_+-=[]\{}|;':,./<>?`~";
    char *tokenPtr;
    int i;
    char a[30]="";
    tokenPtr = strtok(linija,delimiteri);
    while (tokenPtr)
    {
        if(strlen(tokenPtr)>3)
        {
            for(i=0;i<strlen(tokenPtr);i++)
            {
                a[i]=tolower(tokenPtr[i]);
            }
            a[i]='\0';
            if (stop_rijec(a)!=1) 
            {
                r4=nova_rijec(a,kat);
                *l4=dodaj_lista_rijeci(r4,*l4);
            }

        }
        tokenPtr = strtok(NULL, delimiteri);
        }
}
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa strtok funkcijom04.06.2009. u 13:08 - pre 180 meseci
Bafer linija je dužine 130, a privremeni bafer "a" je dužine 30. Ako je token veći od 30 znakova, onda se prekorači granica privremenog bafera. Ako nije to onda šta bi se desilo kad bi ti od čitave petlje ostalo samo ovo, da li bi tokenPtr lepo menjao vrednost:

Code:

while (tokenPtr)
{
    tokenPtr = strtok(NULL, delimiteri);
}

Ako je odgovor da onda ti neka funkcija u petlji menja originalnu liniju, verovatno nova_rijec. Ako je odgovor ne onda nešto nije u redu sa strtok, jer ovo bi trebalo da bude u redu.

 
Odgovor na temu

lejlaz
Lejla Zaimovic
Student
Podgorica

Član broj: 224484
Poruke: 16
77.222.23.*



Profil

icon Re: Problem sa strtok funkcijom04.06.2009. u 14:30 - pre 180 meseci
kad maknem sve dodatne fje iz while potlje, strtok radi dobro.
Ali mi nije jasno kako mogu fje unutar while da mijenjaju cijelu liniju(recenicu) ako im se samo prosledjuje a(rijec). One samo trebaju da kupe rijec po rijec i da ih obradjuju
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa strtok funkcijom04.06.2009. u 14:53 - pre 180 meseci
Debaguj čitav proces korak po korak i sve vreme drži na oku celu početnu liniju, a naročito početak sledećeg (drugog) tokena. Linija bi morala da se promeni u jednom trenutku tokom rada programa. Funkcija nova_rijec ima dva parametra od kojih je jedan veličine 30 a drugi 20 karaktera. Nisu ni tu čista posla.
 
Odgovor na temu

lejlaz
Lejla Zaimovic
Student
Podgorica

Član broj: 224484
Poruke: 16
77.222.20.*



Profil

icon Re: Problem sa strtok funkcijom04.06.2009. u 23:59 - pre 180 meseci
Prosla sam ga debagerom, i vjerovatno i jeste greska u fji nova_rijec, jer mi kroz fju obradi_string sve dobro prolazi, dok se ne vratin iz nova_rijec. Evo i njenog koda:
Code:

struct pojava_u_kat{
    char naziv[15];
    int br_pojava;    double vjer_pojave;
};

struct rijec{
    char tekst[30];
    int brojac_kat;
    pojava_u_kat pripadajuca_kat[50];//1 rijec moze da bude u vise katgorija
};


rijec nova_rijec(char a[],char kat[])
{

    pojava_u_kat k3;
    int i1,i;
       k3=pojava(kat);
    r3.brojac_kat=1;//jer kad dodajemo novu rijec sa njom ide jedna kategorija
    r3.pripadajuca_kat[r3.brojac_kat].br_pojava=k3.br_pojava;
    r3.pripadajuca_kat[r3.brojac_kat].vjer_pojave=k3.vjer_pojave;
    for(i1=0;i1<=strlen(kat);i1++)
        r3.pripadajuca_kat[r3.brojac_kat].naziv[i1]=k3.naziv[i1];//pamtim naziv kategorije
        i=0;
    while (a[i]!='\0')
    {
        r3.tekst[i]=a[i];//naziv rijeci
        i++;
    }    
    r3.tekst[i]='\0';
    return r3;
}

I kad napravi struct rijec, ona se upisuje u listu rijeci sa fjom dodaj_lista_rijeci (rijec r5, lista_rijeci l5).

Tu se a ne prosledjuje, nego cijela rijec. Tako da tu ne bi trebalo da postoji greska. Nisam uspjela da pronadjem debagerom zasto ne prelazi na sledeci token.


EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:

[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]
Time se istovremeno resava i problem pogresnog tumacenja (konflikta) ITALIC taga i "indeks od i" notacije.


[Ovu poruku je menjao X Files dana 05.06.2009. u 08:15 GMT+1]
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa strtok funkcijom05.06.2009. u 10:10 - pre 180 meseci
Probaj ovako:

Code:
rijec nova_rijec(char a[],char kat[])
{
    rijec r3;

    r3.brojac_kat=1;
    r3.pripadajuca_kat[1] = pojava(kat);
    strncpy(r3.tekst, a, sizeof(r3.tekst));

    return r3;
}


Moguće je da imaš grešku tamo gde piše strlen(kat), verovatno tu treba da stoji strlen(k3.naziv), ali kao što vidiš sve to može mnogo jednostavnije.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa strtok funkcijom05.06.2009. u 11:36 - pre 180 meseci
Sad se setih, r3.brojac_kat je jelte 1, ali prvi član niza treba da bude r3.pripadajuca_kat[0]
 
Odgovor na temu

lejlaz
Lejla Zaimovic
Student
Podgorica

Član broj: 224484
Poruke: 16
77.222.20.*



Profil

icon Re: Problem sa strtok funkcijom05.06.2009. u 13:34 - pre 180 meseci
Probala sam i sa izmjenom fje nova_rijec i sa postavljanjem brojaca kategorija na 0, i debagovala dodaj_listu kat, ali mi ponovo kad ucita u listu prvu rijec u debageru za tokenPtr javlja sledece: 0x00079e7a i pod navodnicima neke uspravne linije koje dalje prosledjuje kao novu rijec koju treba upisati u listu.
Evo koda fje dodaj_lista_rijeci


Code:

lista_rijeci dodaj_lista_rijeci (rijec r5,  lista_rijeci l5)

{
    int nadjena_rijec=0;
    int  i,j,ii,jj,m1,m2,m;
    i=1;//gledamo rijeci
    while ((nadjena_rijec==0) && (i<=l5.brrijeci))//do kraja liste rijeci
    {
        j=0;
        int razlicita_rijec=0;
        if(strlen(l5.niz_rijeci[i].tekst)!=strlen(r5.tekst))
            razlicita_rijec=1;//razlicite duzine
        
        while((razlicita_rijec==0) && (j<=strlen(r5.tekst)))
        {
            if (l5.niz_rijeci[i].tekst[j]!=r5.tekst[j])
                razlicita_rijec=1;//razlicite rijeci
            else
                j++;
        }
        
        
        if (razlicita_rijec==0)//postoji rijec,treba provjeriti kat
         {
            nadjena_rijec=1;
             int nadjena_kat=0;
            l5.uk_br_rijeci++;
            ii=1;//gledamo kategorije
            while ((nadjena_kat==0) && (ii<=l5.niz_rijeci[i].brojac_kat))//do kraja liste kat nadjene rijeci
            {
                jj=0;//gleda karaktere stringa kategorija
                int razlicita_kat=0;
                if (strlen(l5.niz_rijeci[i].pripadajuca_kat[ii].naziv)!=strlen(r5.pripadajuca_kat[ii].naziv))
                    razlicita_kat=1;

                while ((razlicita_kat==0) && (jj<=strlen(r5.pripadajuca_kat[ii].naziv)))
                {
                    if (l5.niz_rijeci[i].pripadajuca_kat[ii].naziv[jj]!=r5.pripadajuca_kat[ii].naziv[jj])
                        razlicita_rijec=1;
                    else
                        jj++;
                }//while

                if (razlicita_kat==0)//postoji kategorija za datu rijec
                {
                    nadjena_kat=1;
                    l5.niz_rijeci[i].pripadajuca_kat[ii].br_pojava++; //povecamo br pojava nadjene rijeci u datoj kategoriji
                }
                else//prelazimo na sledecu kategoriju
                    ii++;
            }//while
             if (nadjena_kat==0)//dodavanje nove kategorije
            {
                l5.niz_rijeci[i].brojac_kat++;
                l5.niz_rijeci[i].pripadajuca_kat[l5.niz_rijeci[i].brojac_kat].br_pojava=r5.pripadajuca_kat[ii].br_pojava;
                l5.niz_rijeci[i].pripadajuca_kat[l5.niz_rijeci[i].brojac_kat].vjer_pojave=r5.pripadajuca_kat[ii].vjer_pojave;
                for (m=0;m<=strlen (r5.pripadajuca_kat[ii].naziv);m++)
                    l5.niz_rijeci[i].pripadajuca_kat[l5.niz_rijeci[i].brojac_kat].naziv[m]=r5.pripadajuca_kat[ii].naziv[m];
            }
        }
        i++;

    }//while

     //kraj provjere kategorije
    
    if(nadjena_rijec==0)//dodavanje nove rijeci
        
    {
        l5.uk_br_rijeci++;
        l5.brrijeci++;
        l5.niz_rijeci[l5.brrijeci].brojac_kat=r5.brojac_kat;
        l5.niz_rijeci[l5.brrijeci].pripadajuca_kat[r5.brojac_kat].br_pojava=r5.pripadajuca_kat[r5.brojac_kat].br_pojava;//rijeci u kat=1 na pocetku
        l5.niz_rijeci[l5.brrijeci].pripadajuca_kat[r5.brojac_kat].vjer_pojave=r5.pripadajuca_kat[r5.brojac_kat].vjer_pojave;
        for(m1=0;m1<=strlen(r5.pripadajuca_kat[r5.brojac_kat].naziv);m1++)
                l5.niz_rijeci[l5.brrijeci].pripadajuca_kat[r5.brojac_kat].naziv[m1]=r5.pripadajuca_kat[r5.brojac_kat].naziv[m1];//naziv kategorije

        for(m2=0;m2<=strlen(l5.niz_rijeci[l5.brrijeci].tekst);m2++)
            l5.niz_rijeci[l5.brrijeci].tekst[m2]=r5.tekst[m2];
    }
    
  return l5;
}



Radim klasifikator textualnih clanaka(primjenom Naive Bayes i Knn metode). Zbog ovog problema ne mogu da nastavim sa dljim unosom rijeci, niti da provjeravam rade li mi dobro jos neke fje.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa strtok funkcijom05.06.2009. u 14:54 - pre 180 meseci
Moraš da radiš debagovanje korak po korak (F11 i F10 u Visual C++), i moraš da imaš otvoren prozor sa delom memorije gde je upisana osnovna linija ("Ctrl+Alt+M, 1" u Visual C++). I moraš da nađeš taj trenutak kad se linija promeni. I tu ja ne mogu da ti pomognem, moraš to sama.

I ova funkcija može da se pojednostavi. Algoritam je lakše analizirati i menjati ako je jednostavan. Promenio sam logiku oko članica rijec::brojac_kat i lista_rijeci::brrijeci, tako da oznacavaju broj elemenata u nizu. Opseg elemenata je od nule do datog broja dekrementiranog za jedan (u petljama se koristi "<" umesto "<="). Tako se radi u C-u. Dok programiraš treba da težiš jednostavnosti, i da izbegavaš izmišljanje tople vode (možda do sad nisi znala za funkcije strcmp, strncmp, strcpy, ali sad kad znaš trudi se da ih koristiš svuda gde je to prirodno).

Code:
lista_rijeci dodaj_lista_rijeci (rijec r5, lista_rijeci l5)
{
    int nadjena_rijec=0;
    int  i,ii;
    for (i = 1; (nadjena_rijec == 0) && (i < l5.brrijeci); i++)//gledamo rijeci do kraja liste rijeci
    {
        int razlicita_rijec = strncmp(l5.niz_rijeci[i].tekst, r5.tekst, 30);
        
        if (razlicita_rijec==0)//postoji rijec,treba provjeriti kat
        {
            nadjena_rijec=1;
            int nadjena_kat=0;
            l5.uk_br_rijeci++;
            
            //gledamo kategorije do kraja liste kat nadjene rijeci
            for (ii = 1; (nadjena_kat == 0) && (ii < l5.niz_rijeci[i].brojac_kat); ii++)
            {
                int razlicita_kat =
                    strncmp(l5.niz_rijeci[i].pripadajuca_kat[ii].naziv, r5.pripadajuca_kat[ii].naziv, 15);

                if (razlicita_kat==0)//postoji kategorija za datu rijec
                {
                    nadjena_kat=1;
                    l5.niz_rijeci[i].pripadajuca_kat[ii].br_pojava++; //povecamo br pojava nadjene rijeci u datoj kategoriji
                }
            }//while
            
            if (nadjena_kat==0)//dodavanje nove kategorije
            {
                l5.niz_rijeci[i].pripadajuca_kat[l5.niz_rijeci[i].brojac_kat] = r5.pripadajuca_kat[ii];
                l5.niz_rijeci[i].brojac_kat++;
            }
        }
    }

    //kraj provjere kategorije
    
    if(nadjena_rijec==0)//dodavanje nove rijeci
    {
        l5.uk_br_rijeci++;
        l5.niz_rijeci[l5.brrijeci].brojac_kat = r5.brojac_kat;
        l5.niz_rijeci[l5.brrijeci].pripadajuca_kat[r5.brojac_kat] = r5.pripadajuca_kat[r5.brojac_kat];//rijeci u kat=1 na pocetku

        strncpy(l5.niz_rijeci[l5.brrijeci].tekst, r5.tekst, 30);
        l5.brrijeci++;
    }
    
    return l5;
}

 
Odgovor na temu

lejlaz
Lejla Zaimovic
Student
Podgorica

Član broj: 224484
Poruke: 16
77.222.21.*



Profil

icon Re: Problem sa strtok funkcijom05.06.2009. u 15:21 - pre 180 meseci
Moj moto je "Zasto jednostavno, kad moze komplikovano":)

Nastavicu sa trazenjem greske.
Puno hvala na savjetima.
 
Odgovor na temu

lejlaz
Lejla Zaimovic
Student
Podgorica

Član broj: 224484
Poruke: 16
77.222.23.*



Profil

icon Re: Problem sa strtok funkcijom06.06.2009. u 21:46 - pre 180 meseci
Nasla sam gresku. Kad pokupim jednu rijec sa strtok, pozivam fju stop_rijeci, u kojoj se pretrazuje txt fajl (ako rijec a postoji u stop_rijeci.txt). Ovo pretrazivanje sam realizovala ponovo koristenjem strtok ( da bih izdvajala rijec po rijec iz txt fajla i uporedivala je sa a). Tu se javljao neki konflikt. Pa sam to malo drugacije realizovala.
Moguce je da ne mogu ni da rade dobro jedna u drugoj. Uglavno rijesila sam problem
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa strtok funkcijom06.06.2009. u 23:59 - pre 180 meseci
Ne da je moguće, nego je upravo tako. A i kad malo razmisliš, kad pozoveš strtok(NULL,...) kako funkcija da zna da misliš na prethodni string. Ako ti u budućnosti baš zatreba strtok unutar strtok, onda odradiš do kraja "spoljni" strtok, i sačuvaš tokene (recimo kao niz pointera), a onda odradiš "unutrašnje" strtok-ove po potrebi.

Samo da primetim, greška je bila u delu koda koji nije prikazan. Po Marfijevom zakonu traženja pomoći na forumu obično tako i biva. Zato forumaši i traže minimalni kod koji proizvodi problem, ali ljude mrzi da se trude oko toga. Da ironija bude veća kad bi se potrudili oko minimalnog koda sva je šansa da bi i sami otkrili grešku.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Problem sa strtok funkcijom

[ Pregleda: 2061 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.