title: How can I convert my code to using getchar() putchar() instead of using scanf() and printf() for I/O?
body: <p>I need to use getchar(), putchar() for I/O. My program works just fine but I cannot use it like it is in CodeWarrior for an embedded system. I also need to get rid of malloc() and just use a stack for pop/push. Can I still use <code>strtol</code> if I am no longer using scanf?</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  
  #define MAX 10
  
  float *p, *tos, *bos;
  int *p2, *tos2, *bos2;
  int imode = 1;      
  
  void push(float f); float pop(void);
  void push2(int i); int pop2(void);
  
  int main (void) {
  
      float a, b;
      int c, d;
      char s[64];
      //  p = malloc ( MAX * sizeof *p );
  
      p = (float *) malloc(MAX*sizeof(float));    /* get stack memory */  
      p2 = (int *) malloc(MAX*sizeof(int));       /* get stack memory */
      if (!p || !p2) {
          printf("Allocation Failure\n");
          exit(1);
      }
  
      tos = p; bos = p + MAX-1;
      tos2 = p2; bos2 = p2 + MAX-1;
  
      printf("\nRPN Calculator\n");
      printf("Enter 'i' for Integer mode (default)\n");
      printf("Enter 'f' for Floating point mode\n");
      printf("Enter 'm' to Show Menu\n");
      printf("Enter 'q' to Quit\n\n");
  
      char *endptr;
  
      do {        
          printf("&gt; ");
          scanf("%s", s);
  
          if (imode == 0) {       /* Floating Mode */
  
              float val = strtof(s, &amp;endptr);     /* string to float conversion */
              if (*endptr == '\0') {
                  //printf("Got only the floateger: %d\n", val);
              }
              else {  
                  //printf("operator: %s\n", endptr); 
                  //printf("float: %f\n", val);
                  if (val != 0){      /* don't push val on stack if 0 */
                      push(val);
                  }
              }
  
          switch(*endptr) {
              case 'i':
                  printf("\n (Integer Mode)\n");
                  imode = 1;      /* mode flag */
                  break;
              case 'f':
                  printf("\n (Floating Point Mode)\n");
                  imode = 0;      /* mode flag */
                  break;
              case 'm':
                  printf("\nRPN Calculator\n");
                  printf("Enter 'i' for Integer mode\n");
                  printf("Enter 'f' for Floating point mode\n");
                  printf("Enter 'm' to Show Menu\n");
                  printf("Enter 'q' to Quit\n\n"); 
                  break;
              case '+':
                  a = pop(); b = pop();
                  printf("= %f\n",a+b);
                  push(a+b);
                  break;
              case '-':
                  a = pop(); b = pop(); 
                  printf("= %f\n", b-a); 
                  push(b-a);
                  break;  
              case '*':
                  a = pop(); b = pop(); 
                  printf("= %f\n", a*b); 
                  push(a*b);
                  break;
              case '/':
                  a = pop(); b = pop();
                  if(a == 0){
                      printf("Cannot divide by zero\n");
                      break;
                  }
                  printf("= %f\n", b/a);
                  push(b/a);
                  break;
              case '.':
                  a = pop(); push(a);
                  printf("Top of stack value: %f\n", a);
                  break;  
              default:
                  push(val);
          }
  
          }   
          else {          /* Integer Mode */
  
                  int val2 = strtod(s, &amp;endptr);      /* string to float conversion */
                  if (*endptr == '\0') {
                      //printf("Got only the floateger: %d\n", val);
                  }
                  else {  
                  //printf("operator: %s\n", endptr); 
                  //  printf("int: %d\n", val2);
                      if (val2 != 0){     /* don't push val on stack if 0 */
                          push2(val2);
                      }
                  }
  
              switch(*endptr) {
                  case 'i':
                      printf("\n (Integer Mode)\n");
                      imode = 1;      /* mode flag */
                      break;
                  case 'f':
                      printf("\n (Floating Point Mode)\n");
                      imode = 0;      /* mode flag */
                      break;
                  case 'm':
                      printf("\nRPN Calculator\n");
                      printf("Enter 'i' for Integer mode\n");
                      printf("Enter 'f' for Floating point mode\n");
                      printf("Enter 'm' to Show Menu\n");
                      printf("Enter 'q' to Quit\n\n"); 
                      break;
                  case '+':
                      c = pop2(); d = pop2();
                  //  printf("%d\n", c);
                  //  printf("%d\n", d);
                      printf("= %d\n",c+d);
                      push2(c+d);
                      break;
                  case '-':
                      c = pop2(); d = pop2(); 
                      printf("= %d\n", d-c); 
                      push2(d-c);
                      break;  
                  case '*':
                      c = pop2(); d = pop2(); 
                      printf("= %d\n", c*d); 
                      push2(c*d);
                      break;
                  case '/':
                      c = pop2(); d = pop2();
                      if(c == 0){
                          printf("Cannot divide by zero\n");
                          break;
                      }
                      printf("= %d\n", d/c);
                      push2(d/c);
                      break;
                  case '.':
                      c = pop2(); push2(c);
                      printf("Top of stack value: %d\n", c); 
                      break;  
                  default:
                      //  push(atoi(s));
                      push2(val2);
              }           
          }       
      } while (*s != 'q');    /* Do until 'q' is entered */
  return 0;
  }       
  
  void push (float f) {   /* Put an element on the stack */
      *p = f; 
      p++;
  }
  
  float pop (void) {  /* Get the element from the top of the stack */
      p--;
      return *p;
  }
  
  void push2 (int i) {
      *p2 = i;
      p2++;
  }
  
  int pop2(void) {
      p2--;
      return *p2;
  }
  </code></pre>
  
  <p>This is what I have so far for the int mode:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  
  #define MAX 50
  
  int *p;
  int *tos;
  int *bos;
  
  void push(int i);
  int pop(void);
  
  int main (void)
  {
      int a, b;
      char s[5];
      int c;
      int count;
  
      tos = p;
      bos = p + MAX-1;
  
      printf("\nRPN Calculator\n");
      printf("Enter 'i' for integer mode\n");
      printf("Enter 'f' for floating point mode\n");
      printf("Enter 'q' to quit\n\n");
      char *endptr;
  
      do {        
          printf("&gt; ");
          //scanf("%s", s);
          count = 0;
          while ((count &lt; 5) &amp;&amp; (c != EOF) &amp;&amp; (c !='\n')) {    /* don't go over the array size! */
              s[count] = c;
              ++count;
              c = getchar();     /* get another character */
          }       
  
          //for (c=0; c&lt;count; c++) {
          //putchar(c);
          //}
  
          int val = strtol(s, &amp;endptr, 10);
  
          if (*endptr == '\0') {
              //printf("Got only the integer: %d\n", val);
          }
          else {  
              //printf("operator: %s\n", endptr); 
              //printf("integer: %d\n", val);
              if (val != 0){      /* don't push val on stack if 0 */
                  push(val); 
              }
          }
  
              switch(*endptr) {
           case 'i':
           printf("(Integer Mode)\n");
           break;
           case 'f':
           printf("(Floating Point Mode)\n");
           break;
           case '+':
           a = pop();
           b = pop();
           // printf("%d\n",a);
           // printf("%d\n",b);
           // printf("%d\n",val);
           printf("%d\n", a+b);
           push(a+b);
           break;
           case '-':
           a = pop(); 
           b = pop(); 
          // printf("%d\n", b-a); 
           push(b-a);
           break; 
           case '*':
           a = pop(); 
           b = pop(); 
          // printf("%d\n", a*b); 
           push(a*b);
           break;
           case '/':
           a = pop(); 
           b = pop();
           if(a == 0){
          // printf("Cannot divide by zero\n");
           break;
           }
          // printf("%d\n", b/a);
           push(b/a);
           break;
           case '.':
           a = pop(); push(a);
          // printf("Current value on top of stack: %d\n", a);
  
           break; 
           default:
           push(val);
           }
      } while (c != 'q'); /* Do until 'q' is entered */
  
      return 0;
  }       
  
  void push (int i)   /* Put an element on the stack */
  {
      if (p &gt; bos){
          printf("Stack Full\n");
          return;
      }
      *p = i;
      p++;
  }
  
  int pop (void)  /* Get the element from the top of the stack */
  {
      p--;
      if(p &lt; 0) {
          printf("Stack Underflow\n");
          return 0;
      }
      return *p;
  }
  </code></pre>