[ANSI C]problema con strtok

di il
27 risposte

27 Risposte - Pagina 2

  • Re: [ANSI C]problema con strtok

    La funzione deve creare un array di n struct
    però il prototipo della funzione è il seguente:
    
    Quiz *quiz_read (char *qspec[], int n)
    quindi dovrebbe restituire il puntatore a un array...
  • Re: [ANSI C]problema con strtok

    DEVE RESTITUIRE UN ARRAY SOTTO FORMA DI PUNTATORE ALLA PRIMA CELLA. che è diverso da un puntatore ad un array.Quiz * è un puntatore ad una struttura di Quiz e + precisamente alla prima cella q[0]. Siccome queste celle sono concatenate ti viene tornato un array di struct che iniziano dalla cella 0 alla cella n-1.
  • Re: [ANSI C]problema con strtok

    Quindi alla funzione faccio ritornare q.
    ora io ho una sottofunzione che invece mi riempe i campi della struct
    se io scrivo
    
    Quiz riempistruct(char *p)   /*prototipodella sottofunzione*/
    
    /*nella funzione principale*/
    Quiz *q;
    q = (Quiz *)malloc(n*sizeof(Quiz));
    q[0]=riempistruct(p);
    questo assegnamento è giusto?
  • Re: [ANSI C]problema con strtok

    Q[0] ha il suo spazio in memoria ben definito. Devi passare questo spazio alla fuzione riempistruct e riempirlo da lì.
    
    void riempistruct(char *p, Quiz *cella-i-esima);
    
  • Re: [ANSI C]problema con strtok

    Allora io ho scritto questo
    
    Quiz *quiz_read(char *qspec[], int nq){
        int i;
        char *p;
        Quiz *a;
        a=(Quiz *)malloc(nq*sizeof(Quiz));
        for (i=0;i<nq;i++){
            p=qspec[i];
            if (p[0] == 'M')
                qmultiplo(p,a,i);
            else if (p[0] == 'W')
                qtestuale(p,a,i);
            else qnumerico(p,a,i);}
        return a;
    }
    e sembra funzionare perchè a[0] viene riempito correttamente.
    però nel debugger vedo che a non è formato da nq struct ma da una sola
  • Re: [ANSI C]problema con strtok

    Perche il debugger ti fa vedere solo a[0] che coincide con *a. Prova in watch a mettere a[1] ecc. dovrebbe farteli vedere.
  • Re: [ANSI C]problema con strtok

    Capito. Ma questa cosa vale anche per gli array?
    Perchè io ho dichiarato nel main un array q[7] però nel debugger non vedo tutti gli elementi.
  • Re: [ANSI C]problema con strtok

    Io vedo l'elenco dei indici dal 0 al 6 come è normale che sia. Visual Studio.
  • Re: [ANSI C]problema con strtok

    Io con Netbeans devo mettere i watch nonostante ho dichiarato la dimensione.
    se posoo chiederti un altro aiutino:
    con queste due funzioni:
    
    int risnumerico(Quiz *qn, char *t){
        int j,dim,ris,r=0;
        char *risp,del[]="#";
        dim = strcspn(t,del);
        risp = (char*)malloc(dim*sizeof(char));
        strncpy(risp,t,dim);
        risp[dim] = '\0';
        ris = atoi(risp);
        free(risp);
        for (j=0;j<qn->spec.number.n;j++){
            if (ris == qn->spec.number.solutions[j]){
                r += qn->score;
                break;
            }
        }
        return r;
    
    }
    
    int ristestuale(Quiz *qt, char *s){
        int h,lenght,p=0;
        char *rispt,del[]="#";
        lenght = strcspn(s,del);
        rispt = (char*)malloc(lenght*sizeof(char));
        strncpy(rispt,s,lenght);
        rispt[lenght] = '\0';
        for (h=0;h<qt->spec.word.n;h++){
            if (strcmp(rispt,qt->spec.word.solutions[h]) == 0){
                p += qt->score;
                break;
            }
        }
        free(rispt);
        return p;
    }
    il debugger mi da un errore di SIGTRAP.
    entrambe devono prendere una parte della stringa in input e confrontarla con le n soluzioni(nella prima le soluzioni sono int e nella seconda stringhe).
    per la seconda funzione penso che il problema sia dovuto alla strcmp che vuole le due stringhe const(a proposito ho capito perchè la strtok non funzionava) però per la prima non capisco proprio(sarà anche che oltre a C sto preparando altri due esami).
  • Re: [ANSI C]problema con strtok

    Sia nella prima che nella seconda non hai lasciato spazio per il '\0'. guarda quà:
    
    dim = strcspn(t,del);
    
    poi hai il malloc della dimensione del dim, ma dovresti allocare spazio anche x 1 char in +. così lo strncpy ti funziona
  • Re: [ANSI C]problema con strtok

    Ho corretto e provato le tre funzioni separatemente e funzionano perfettamente.
    Le metto insieme nel programma e mi da errore.
    A questo punto penso sia sbagliata la dichiarazione delle struct perchè col debugger ho notato che negli array che contengono le varie soluzioni mi alloca più spazio del necessario.
    
    int main() {
        Quiz Q[7];
        int punteggio,n=7;
        char *answers;
        Q[0].type = Q_MULTI;
        Q[0].score = 4;
        Q[0].question = "Come si chiama il satellite della terra?";
        Q[0].spec.multi.sol = 'B';
        Q[0].spec.multi.choices[0] = "Giove";
        Q[0].spec.multi.choices[1] = "Terra";
        Q[0].spec.multi.choices[2] = "Marte";
        Q[0].spec.multi.choices[3] = "Luna";
        Q[1].type = Q_WORD;
        Q[1].score = 3;
        Q[1].question = "Una provincia dell'Umbria";
        Q[1].spec.word.n = 2;
        Q[1].spec.word.solutions = (char**)malloc(2*sizeof(char*));
        Q[1].spec.word.solutions[0] = "Terni";
        Q[1].spec.word.solutions[1] = "Perugia";
        Q[2].type = Q_NUMBER;
        Q[2].score = 2;
        Q[2].question = "Un numero primo tra 30 e 40";
        Q[2].spec.number.n = 2;
        Q[2].spec.number.solutions = (int*)malloc(2*sizeof(int));
        Q[2].spec.number.solutions[0] = 31;
        Q[2].spec.number.solutions[1] = 37;
        Q[3].type = Q_WORD;
        Q[3].score = 5;
        Q[3].question = "Un anagramma di torta";
        Q[3].spec.word.n = 3;
        Q[3].spec.word.solutions = (char**)malloc(Q[3].spec.word.n*sizeof(char*));
        Q[3].spec.word.solutions[0] = "ratto";
        Q[3].spec.word.solutions[1] = "rotta";
        Q[3].spec.word.solutions[2] = "trota";
        Q[4].type = Q_NUMBER;
        Q[4].score = 7;
        Q[4].question = "In che anno nacque Dante Alighieri?";
        Q[4].spec.number.n = 1;
        Q[4].spec.number.solutions = (int*)malloc(1*sizeof(int));
        Q[4].spec.number.solutions[0] = 1265;
        Q[5].type = Q_MULTI;
        Q[5].score = 5;
        Q[5].question = "Chi ha scritto l'Orlando Furioso?";
        Q[5].spec.multi.sol = 'C';
        Q[5].spec.multi.choices[0] = "Torquato Tasso";
        Q[5].spec.multi.choices[1] = "Dante Alighieri";
        Q[5].spec.multi.choices[2] = "Ludovico Ariosto";
        Q[5].spec.multi.choices[3] = "Giovanni Boccaccio";
        Q[6].type = Q_NUMBER;
        Q[6].score = 4;
        Q[6].question = "Un cubo di 4 cifre";
        Q[6].spec.number.n = 13;
        Q[6].spec.number.solutions = (int*)malloc(13*sizeof(int));
        Q[6].spec.number.solutions[0] = 1000;
        Q[6].spec.number.solutions[1] = 1331;
        Q[6].spec.number.solutions[2] = 1728;
        Q[6].spec.number.solutions[3] = 2197;
        Q[6].spec.number.solutions[4] = 17576;
        Q[6].spec.number.solutions[5] = 2474;
        Q[6].spec.number.solutions[6] = 3375;
        Q[6].spec.number.solutions[7] = 4096;
        Q[6].spec.number.solutions[8] = 4913;
        Q[6].spec.number.solutions[9] = 5832;
        Q[6].spec.number.solutions[10] = 6859;
        Q[6].spec.number.solutions[11] = 8000;
        Q[6].spec.number.solutions[12] = 9261;
        answers = "B#Fabriano##rotta#1265##4913#";
        punteggio = quiz_score(Q,n,answers);
        printf("%d\n",punteggio);
        return 0;
  • Re: [ANSI C]problema con strtok

    
    Q[1].spec.word.solutions = (char**)malloc(2*sizeof(char*));
    Q[1].spec.word.solutions[0] = "Terni";
    Q[1].spec.word.solutions[1] = "Perugia";
    
    per me questo è un errore. hai allocato spazio x due puntatori a char array ma non per contenere anche le stringhe Terni e Perugia.
  • Re: [ANSI C]problema con strtok

    Questa parte me l'ero dimenticata perchè facendo varie prove per le funzioni mi sono perso qualche pezzo
    comunque anche con queste correzioni non funziona. Ma penso che a questo punto sia Netbeas perchè usando il debugger, se vado a vedere gli elementi di Q mi mostra solo i primi 3.
    Va bene così tanto le funzioni fanno il loro compito e sono queste che devo consegnare, ci pensa il professore a scrivere il main.
    Ora mi concentro sull'ultimo esercizo.
    Grazie mille per tutto l'aiuto skynet
Devi accedere o registrarti per scrivere nel forum
27 risposte