PDA

Visualizza la versione completa : [C] Uso dei token con la funzione strtok()


Rudie
07-09-2011, 15:39
infile.txt



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


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



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?

Kamui
07-09-2011, 15:58
in che senso non funziona? A me funziona:



$ ./prova
token: 621.4
TOKEN: 2
TOKEN: +
TOKEN: 6.12
TOKEN: +
TOKEN: 12
TOKEN: -

token: 19
TOKEN: 2
TOKEN: +
TOKEN: 9
TOKEN: +
TOKEN: 15
TOKEN: -

token: 14
TOKEN: 488
TOKEN: +
TOKEN: 6
TOKEN: +
TOKEN: 10
TOKEN: -

token: 12
TOKEN: 2
TOKEN: +
TOKEN: 232
TOKEN: +
TOKEN: 12
TOKEN: -

token: 916
TOKEN: 2
TOKEN: +
TOKEN: 13
TOKEN: +
TOKEN: 12
TOKEN: -

token: 22
TOKEN: 5
TOKEN: +
TOKEN: 700
TOKEN: +
TOKEN: 32
TOKEN: -

token: 19
TOKEN: 2
TOKEN: +
TOKEN: 1
TOKEN: +
TOKEN: 15
TOKEN: -

token: 30
TOKEN: 5
TOKEN: -
TOKEN: 7
TOKEN: *


sh: PAUSE: not found

Rudie
07-09-2011, 16:01
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


token: 621.4 ---numero
TOKEN: 2 ---numero
TOKEN: + ---addizione
TOKEN: 6.12 ---numero
TOKEN: + ---addizione
TOKEN: 12 ---numero
TOKEN: - ---sottrazione

Kamui
07-09-2011, 16:32
A parte il filtro sul newline direi che questo funziona :popcorn:



#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: ", 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;
}




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

sh: PAUSE: not found

Rudie
07-09-2011, 19:46
Grazie mille Kamui :zizi: , 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?

Rudie
07-09-2011, 21:12
Essendo un diverso argomento quello del preprocessore ho aperto una nuova discussione al link http://forum.html.it/forum/showthread.php?s=&threadid=1475714 però in questa discussione mi rimane il problema sull'avvertimento del compilatore.

Loading