Write the function strrindex(s,t) , which returns the position of the rightmost occurrence of t in s , or -1 if there is none.
Extend atof to handle scientific notation of the form 123.45e-6 where a floating-point number may be followed by e or E and an optionally signed exponent.
Given the basic framework, it's straightforward to extend the calculator. Add the modulus ( % ) operator and provisions for negative numbers.
Add commands to print the top element of the stack without popping, to duplicate it, and to swap the top two elements. Add a command to clear the stack.
Add access to library functions like sin , exp , and pow . See <math.h> in Appendix B, Section 4.
Add commands for handling variables. (It's easy to provide twenty-six variables with single-letter names.) Add a variable for the most recently printed value.
Write a routine ungets(s) that will push back an entire string onto the input. Should ungets know about buf and bufp , or should it just use ungetch ?
Suppose that there will never be more than one character of pushback. Modify getch and ungetch accordingly.
Our getch and ungetch do not handle a pushed-back EOF correctly. Decide what their properties ought to be if an EOF is pushed back, then implement your design.
An alternate organization uses getline to read an entire input line; this makes getch and ungetch unnecessary. Revise the calculator to use this approach.
Modify getop so that it doesn't need to use ungetch. Hint: use an internal static variable.
Adapt the ideas of printd to write a recursive version of itoa ; that is, convert an integer into a string by calling a recursive routine.
Write a recursive version of the function reverse(s) , which reverses the string s in place.
Define a macro swap(t,x,y) that interchanges two arguments of type t . (Block structure will help.)