Problems in evaluating postfix
I have got a fully working function that converts infix to postfix, but now I am having trouble w/ the second stage in evaluating the equation in postfix. I realise that there is an example given in K&R but I don't really understand it & have decided to make my own from scratch.
I had this algorithm working yesterday, but I changed it as it was extracting from the wrong end and couldn't parse equations like: 1 2 - 4 5 + *. The problem I am having is:
given the input 1 2 -, it returns 1 instead of -1;
given the input 666 1 -, it returns 65 instead of 665;
given the input 1+2, it returns nothing instead of 3 etc.
I am sure the function performoperation is working correctly & i have also checked that evaluation is correct for the above inputs after the strncpy function is called. I have not changed anything in what calls this function (& also this function is called on a button-click even so I cannot post it here).
No idea as to the cause of this problem (I was going really well until this prob arose) Please Help!
Code:
//INP: equation OUT: evaluation
char *EvaluateEquation(char *equation, char *evaluation) {
int op1, op2, signbit = 0;
int nextToken = 0;
char *writeoperation;
while (*equation != '\0') {
if (isdigit(*equation)) {
while (isdigit(*equation) || *equation == '.') {
*evaluation++ = *equation++; //Store number to evaluation
if (!nextToken) nextToken = 1; //Space Seperate each operand
}
}
else if (CheckIfOperator(*equation)) {
op1 = 0;
op2 = 0;
evaluation -= 2;
/*Read operands in reverse order starting from the end */
//keep extracting until a ' ' is found & store the number
do {
if (*evaluation == '-') signbit = 1;
else {
op2 = op2 * 10 + (*evaluation - '0');
if (signbit) {
op2 = -op2;
signbit = 0;
}
}
evaluation--;
} while (*evaluation != ' ');
evaluation--; //Skip the space
//keep extracting until another ' ' is found & store number
while (*evaluation != ' ' && *evaluation != '\0') {
if (*evaluation == '-') signbit = 1;
else {
op1 = op1 * 10 + (*evaluation - '0');
if (signbit) {
op1 = -op1;
signbit = 0;
}
}
evaluation--;
}
writeoperation = performoperation(op1, op2, *equation); //Works fine upto and including this line
if (writeoperation == NULL){ //Check for DB0
strcpy(evaluation, "ERROR: Division by Zero");
return evaluation;
}
strncpy(evaluation, writeoperation, sizeof(writeoperation));
while (*evaluation != ' ') { // ' ' at the end of the operand
evaluation++;
}
evaluation++; //we shouldn't have removed the space
/* the operation has been performed so set the reset address to
the next element, as the operation cannot be overwritten by
an operand. All remains of operands MUST be removed from
evaluation before continuing*/
while (*evaluation != '\0') *evaluation++ = '\0';
/*Note: if second operator not found, evaluation = evalcopy
then evaluation-- till *evaluation == ' ' */
equation++;
}
else if (*equation == ' ') equation++;
//if nextToken add space to evaluation
if (nextToken) { //Space-seperate each token, this helps w/ multiple
*evaluation++ = ' '; //digits
nextToken = 0;
}
}
equation++;
}