Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95

    [C] problema con i token di strtok

    infile.txt
    codice:
    621.4 2 + 6.12 + 12 -
    19 2 + 9 + 15 -
    14 488 + 6 + 10 -
    12 2 + 232 + 12 -
    916 2 + 13 + 12 -
    22 5 + 700 + 32 -
    
    19 2 + 1 + 15 -
    30  5  -  7  *
    programma.c
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    
    int main(void){
        char mio_buf[100];
        char* tmp_string[10];
        char* prr[10];
        FILE *file_in_ptr;
        int index;
        double val;
        
        if((file_in_ptr=fopen("infile.txt","r"))==NULL)exit(1);
        while(fgets(mio_buf, 100, file_in_ptr)){
                             index=0;
                             if(mio_buf[0]!='\n'){
                             tmp_string[index]=strtok(mio_buf, " ");
                             printf("token: %s\n", tmp_string[index]);
                             //stampa il primo token della riga
                             //di sicuro è un numero
                             //val=atof(tmp_string[index])+0.1;
                             //printf("double + 0.1 = %.2f\n", val);
                             while((tmp_string[index++]=strtok(NULL, " "))!=NULL) {
                                printf("TOKEN: %s\n", tmp_string[index-1]);
                                }
                             //stampa il resto
                             }
        }
    
        
    fclose(file_in_ptr);
    printf("\n");   
    system("PAUSE"); 
    return 0;   
    }
    In mezzo ho commentato delle istruzioni per vedere se veramente potevo trasformare il token in double e funziona!

    codice:
    if(strncmp(tmp_string[index-1],"-",0)==0)
     printf("sottrazione\n");
    else if(strcmp(tmp_string[index-1],"+")==0)
     printf("addizione\n");
    else if(strcmp(tmp_string[index-1],"*")==0)
     printf("moltiplicazione\n");
    else if(strcmp(tmp_string[index-1],"/")==0)
     printf("divisione\n");
    else { //dovrebbe essere un numero
     val=atof(tmp_string[index])+0.1;
     printf("double + 0.1 = %.2f\n", val);
    }
    Con questo codice ho provato ad identificare il token ma non funziona.
    Ho provato anche a passare il token come paramentro in un'altra funzione così da non incasinare nulla ma faccio danno lo stesso.
    Mi sapreste aiutare?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    in che senso non funziona? A me funziona:

    Codice PHP:
    $ ./prova
    token
    621.4
    TOKEN
    2
    TOKEN
    : +
    TOKEN6.12
    TOKEN
    : +
    TOKEN12
    TOKEN
    : -

    token19
    TOKEN
    2
    TOKEN
    : +
    TOKEN9
    TOKEN
    : +
    TOKEN15
    TOKEN
    : -

    token14
    TOKEN
    488
    TOKEN
    : +
    TOKEN6
    TOKEN
    : +
    TOKEN10
    TOKEN
    : -

    token12
    TOKEN
    2
    TOKEN
    : +
    TOKEN232
    TOKEN
    : +
    TOKEN12
    TOKEN
    : -

    token916
    TOKEN
    2
    TOKEN
    : +
    TOKEN13
    TOKEN
    : +
    TOKEN12
    TOKEN
    : -

    token22
    TOKEN
    5
    TOKEN
    : +
    TOKEN700
    TOKEN
    : +
    TOKEN32
    TOKEN
    : -

    token19
    TOKEN
    2
    TOKEN
    : +
    TOKEN1
    TOKEN
    : +
    TOKEN15
    TOKEN
    : -

    token30
    TOKEN
    5
    TOKEN
    : -
    TOKEN7
    TOKEN
    : *


    shPAUSEnot found 
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95
    Sì, il risultato è quello però io vorrei controllare token per token e se si tratta di un + voglio fare una cosa, se un * un'altra e così via dicendo come in quella cascata di if.
    Non so se mi sono spiegato bene...

    Vorrei una cosa del genere
    codice:
    token: 621.4 ---numero
    TOKEN: 2 ---numero
    TOKEN: + ---addizione
    TOKEN: 6.12 ---numero
    TOKEN: + ---addizione
    TOKEN: 12 ---numero
    TOKEN: - ---sottrazione

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    A parte il filtro sul newline direi che questo funziona

    Codice PHP:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>


    int main(void){
        
    char mio_buf[100];
        
    chartmp_string[10];
        
    charprr[10];
        
    FILE *file_in_ptr;
        
    int index;
        
    double val;
        
        if((
    file_in_ptr=fopen("infile.txt","r"))==NULL)exit(1);
        while(
    fgets(mio_buf100file_in_ptr)){
                             
    index=0;
                             if(
    mio_buf[0]!='\n'){
                             
    tmp_string[index]=strtok(mio_buf" ");
                             
    printf("token: %s: "tmp_string[index]);
                             
    //stampa il primo token della riga
                             //di sicuro è un numero
                             
    val=atof(tmp_string[index])+0.1;
                             
    printf("double + 0.1 = %.2f\n"val);
                             while((
    tmp_string[index++]=strtok(NULL" "))!=NULL) {
                                
    printf("TOKEN: %s: "tmp_string[index-1]);
                    if(
    tmp_string[index-1][0]=='-')
                     
    printf("sottrazione\n");
                    else if(
    tmp_string[index-1][0]=='+')
                     
    printf("addizione\n");
                    else if(
    tmp_string[index-1][0]=='*')
                     
    printf("moltiplicazione\n");
                    else if(
    tmp_string[index-1][0]=='/')
                     
    printf("divisione\n");    
                    else { 
                     
    val=atof(tmp_string[index-1])+0.1;
                     
    printf("double + 0.1 = %.2f\n"val);
                    }

                                }
                             
    //stampa il resto
                             
    }
        }

        
    fclose(file_in_ptr);
    printf("\n");   
    system("PAUSE"); 
    return 
    0;   

    Codice PHP:
    $ ./prova
    token
    621.4double 0.1 621.50
    TOKEN
    2double 0.1 2.10
    TOKEN
    : +: addizione
    TOKEN
    6.12double 0.1 6.22
    TOKEN
    : +: addizione
    TOKEN
    12double 0.1 12.10
    TOKEN
    : -
    sottrazione
    token
    19double 0.1 19.10
    TOKEN
    2double 0.1 2.10
    TOKEN
    : +: addizione
    TOKEN
    9double 0.1 9.10
    TOKEN
    : +: addizione
    TOKEN
    15double 0.1 15.10
    TOKEN
    : -
    sottrazione
    token
    14double 0.1 14.10
    TOKEN
    488double 0.1 488.10
    TOKEN
    : +: addizione
    TOKEN
    6double 0.1 6.10
    TOKEN
    : +: addizione
    TOKEN
    10double 0.1 10.10
    TOKEN
    : -
    sottrazione
    token
    12double 0.1 12.10
    TOKEN
    2double 0.1 2.10
    TOKEN
    : +: addizione
    TOKEN
    232double 0.1 232.10
    TOKEN
    : +: addizione
    TOKEN
    12double 0.1 12.10
    TOKEN
    : -
    sottrazione
    token
    916double 0.1 916.10
    TOKEN
    2double 0.1 2.10
    TOKEN
    : +: addizione
    TOKEN
    13double 0.1 13.10
    TOKEN
    : +: addizione
    TOKEN
    12double 0.1 12.10
    TOKEN
    : -
    sottrazione
    token
    22double 0.1 22.10
    TOKEN
    5double 0.1 5.10
    TOKEN
    : +: addizione
    TOKEN
    700double 0.1 700.10
    TOKEN
    : +: addizione
    TOKEN
    32double 0.1 32.10
    TOKEN
    : -
    sottrazione
    token
    19double 0.1 19.10
    TOKEN
    2double 0.1 2.10
    TOKEN
    : +: addizione
    TOKEN
    1double 0.1 1.10
    TOKEN
    : +: addizione
    TOKEN
    15double 0.1 15.10
    TOKEN
    : -
    sottrazione
    token
    30double 0.1 30.10
    TOKEN
    5double 0.1 5.10
    TOKEN
    : -: sottrazione
    TOKEN
    7double 0.1 7.10
    TOKEN
    : *
    moltiplicazione

    sh
    PAUSEnot found 
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95
    Grazie mille Kamui , ora la mia calcolatrice in notazione polacca inversa funziona!
    Però c'è un solo problemino, il compilatore mi dice "[Warning] passing arg 1 of 'initialize/push/pop' from incompatible pointer type": come mai?

    AH, un'ultima cosa. Nelle richieste del progetto c'è "Direttive al preprocessore. Utilizzando le direttive al preprocessore definire una costante DEBUG. Quando DEBUG non sarà posta a 0, saranno stampati alcuni messaggi utili in fase di debugging; diversamente tali messaggi non saranno stampati.": cosa devo fare?

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95
    Essendo un diverso argomento quello del preprocessore ho aperto una nuova discussione al link http://forum.html.it/forum/showthrea...readid=1475714 però in questa discussione mi rimane il problema sull'avvertimento del compilatore.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.