Hello,
I am new in C programming, I am writing a function to evaluate a prefix arithmetic expression. I know my code works well but it seems the message floating exception (core dumped) is because if my (preval / 0) the program is not going to work. However, I would like to add this condition to avoid the the floating exception (core dumped)
if (function == 0) {puts("Division by zero is invalid"); exit(0);}
This is some of my code.
#include <stdio.h> /* for printf in C programs */
#include <stdlib.h> /* for exit() in C programs */
#define LEN 30
char testing[] = "+42+55-6 8" ;
/* gettoken for arithmetic expression.
* Only recognize + - * / ( ) and digits.
* Any other character ignored, such as space, must be used to separate consecutive numbers
* EXIT on end of line or string
* Return value:
* 1. non-negative integer OR
* 2. negative of single character token
* uses fgetc, ungetc file functions, for stdin, or fmemopen for strings in memory
*/
#define isdigit(ch) ch >= '0' && ch <= '9'
int gettoken (FILE * f) {
int sum = 0;
while(1) {
char ch = fgetc(f); // first unprocessed char
if (isdigit(ch))
{ sum = ch&0xF; // start of number
ch = fgetc(f);
while (isdigit(ch))
{ sum = sum*10 + (ch&0xF);
ch = fgetc(f);
}
ungetc (ch, f); // finished number, do not consume non-numeral
return sum;
}
else if (ch=='+'||ch=='-'||ch=='*'||ch=='/')
return -ch; // found an operator
else if (ch==0 || ch=='\n') // no more characters
{ puts("--no more input--");
exit(0);
}
} // end while. Ignoring space or other chars.
}
int preval(FILE *f);
FILE *fmemopen(void*,size_t,const char*); // needed for c99
int main() {
// FILE * membuf = fmemopen(testing, LEN,"r"); // will be used by mipsmark
puts("Enter a prefix arithmetic expression:");
printf ("Evaluates to %d\n", preval(stdin));
return 0;
}
/* Any changes above this line will be discarded by
# mipsmark. Put your answer between dashed lines. */
/*-------------- start cut ----------------------- */
/* Student's Name: */
int preval(FILE *f) {
/* getting the token */
int token = gettoken(f);
/* switching the negative of token to branch into any binary operation, if any */
switch (-token) {
case '+':
/* addition */
return preval(f) + preval(f);
case '-':
/* substraction */
return preval(f) - preval(f);
case '*':
/* multiplication */
return preval(f) * preval(f);
case '/':
/* division */
return preval(f) / preval(f);
}
/* numeric result of the prefix */
return token;
}