codice:
/* eval_expr.symbol */

int	Plus(int a,int b)
{
	return (a+b);
}

int	Minus(int a,int b)
{
	return (a-b);
}

int	Divide(int a,int b)
{
	return (a/b);
}

int	Multiply(int a,int b)
{
	return (a*b);
}

int	Modulus(int a,int b)
{
	return (a%b);
}

typedef struct _operand
{
	char symbol;
	int  preced;
	int  (*funct)();
} Operand;


Operand	operand [] =
{
	{'+',1,Plus},
	{'-',1,Minus},
	{'/',2,Divide},
	{'*',2,Multiply},
	{'%',2,Modulus},
	{0,0,0}
};

int	FindLastOp(char *str,int preced)
{
	int	pos,i,numParent,retValue;
	   
	//valore di ritorno
	retValue = -2;

	//stato bilanciamento parentesi
	numParent = 0;

	//partiamo da fine stringa
	pos = strlen(str)-1;

	//per ogni carattere str[pos]
	//fino ad arrivare all'inizio dell'espressione
	while (pos>=0)
	{
		//teniamo conto delle parentesi incontrate
		if (str[pos] == ')')
			numParent ++;
		if (str[pos] == '(')
			numParent --;

		i = 0;
		//per tutti gli operatori definiti e finchè le 
		//parentesi non sono bilanciate
		while (!numParent && operand[i].symbol)
		{
			//se il carattere corrente è un'operatore
			if (operand[i].symbol == str[pos])
			{
				retValue = -1;
				if (operand[i].preced == preced)
					return (pos);
			}
			//prossimo operatore
			i++;
		}
		//carattere successivo (o meglio precedente)
		pos--;
	}
	return (retValue);
}

int	is_nb(char *str)
{
	if ( *str == '(' )
	{
		str[strlen(str)-1] = 0;
		return (eval_expr_sub(str+1,0));
	}
	return (atoi(str));
}

int	eval_expr_sub(char *str,int preced)
{
	int	pos;
	char save;
	int	nb2;
	if ((pos = FindLastOp(str,preced))==-1)
		return (eval_expr_sub(str,preced+1));
	if (pos==-2)
		return (is_nb(str));
	nb2 = eval_expr_sub(str+pos+1,preced+1);
	save = str[pos];
	str[pos] = 0;
	pos = 0;
	while (operand[pos].symbol)
	{
		if (save==operand[pos].symbol)
			return (operand[pos].funct(eval_expr_sub(str,preced),nb2));
		pos ++;
	}   
	printf("PB !!!\n");
	return (0);
}


int	eval_expr(char *str)
{
	return (eval_expr_sub(str, 0));
}
Questo è il codice di un semplice parser di espressioni aritmetiche,studiatelo un pò e capirai molte cose riguardo a ciò che hai chiesto.
Un membro di questo forum (SnakePlissken) sta (o stava non so),estendendo questo parser al fine di fargli supportare anche operazioni più complesse,contatta lui se ti interessa,comunque lui ha postato l'intero codice del suo parser sul forum e io l'ho scaricato,se ti interessa ce l'ho anche io.