Però mi pare di capire, alla veloce, che la tua funzione risolve solo le espressioni con numeri minori di 10
Io ho fatto così:
int eval(char *str)
{
float numeri[N];/*vettore di tutti i numeri */
char simboli[N];/* vettore di tutti gli operatori */
int i,j,dim,finito,errore;/*indici; i,j ; flag: finito,errore*/
i=0;/*controllo della correttezza della stringa, se erroro uscirà con 0 */
errore=FALSO;
while((str[i]!='\0') && (i+1<N) && (!errore))
{
if(isalpha(str[i]))
errore=VERO;
if(ispunct(str[i]))
{
if(!isdigit(str[i+1]))
errore=VERO;
}
i++;
}
if(!errore)/* passato il test di formato*/
{
i=0;/*estrapolazione dei numeri e degli operatori, ordinatamente*/
j=0;
finito=FALSO;
while(!finito)
{
sscanf(&str[j],"%f",&numeri[i]);
j += strcspn (&str[j],"+-*/");
sscanf(&str[j],"%c",&simboli[i]);
if(simboli[i]=='\0')
finito =VERO;
i++;
j++;
}
dim=i;/* quantita di valori numerici trovati */
/*svolgo tutti i prodotti e le divisioni , e dopo somme e differenze ,come indicato da http://it.wikipedia.org/wiki/Ordine_delle_operazioni*/
/* eseguo i prodotti e le divisioni spostando gli operatori e i numeri di conseguenza : esempio
1+2*3*4-2*3+4 diventerà 1+12*4-12+4 poi 1+48-12+4 , spostando i segni e i numeri nel vettore.*/
finito = FALSO;
i=0;
while(!finito)
{
if(simboli[i]=='*')
{
numeri[i]=numeri[i]*numeri[i+1];
dim--;
for (j=i+1; j<dim; j++)
numeri[j]=numeri[j+1];
for(j=i; j<dim; j++)
simboli[j]=simboli[j+1];
i=0;
}
else if(simboli[i]=='/')
{
numeri[i]=numeri[i]/numeri[i+1];
dim--;
for (j=i+1; j<dim; j++)
numeri[j]=numeri[j+1];
for(j=i; j<dim; j++)
simboli[j]=simboli[j+1];
i=0;
}
else i++;
if(i>dim)
finito=VERO;
}
/* eseguo le somme e le differenze nello stesso modo sopra*/
finito = FALSO;
i=0;
while(!finito)
{
if(simboli[i]=='+')
{
numeri[i]=numeri[i]+numeri[i+1];
dim--;
for (j=i+1; j<dim; j++)
numeri[j]=numeri[j+1];
for(j=i; j<dim; j++)
simboli[j]=simboli[j+1];
i=0;
}
else if(simboli[i]=='-')
{
numeri[i]=numeri[i]-numeri[i+1];
dim--;
for (j=i+1; j<dim; j++)
numeri[j]=numeri[j+1];
for(j=i; j<dim; j++)
simboli[j]=simboli[j+1];
i=0;
}
else i++;
if(i>dim)
finito=VERO;
}
}
else/* se c'è stato l'errore nella codifica*/
numeri[0]=0;
/* restituisce il valore finale del processo oppure l'errore (problema di distinguere i due casi) */
return (int)numeri[0];
/* esempio: 2+3*4*5-2*3 -> 2+12*5-12 -> 2+60-6 -> 62-6 -> 56 */
/*si è preferito usare i float per evitare errori troppo grossi nella elaborazione delle divisioni , restituendo soltanto alla fine un valore intero*/
}
Penso che esista un modo più semplice ma a me è venuto da fare così