2010-02-11 22 views
1

我需要爲I/O使用getchar(),putchar()。我的程序工作得很好,但我無法像嵌入式系統的CodeWarrior一樣使用它。我還需要擺脫malloc(),並使用pop/push堆棧。如果我不再使用scanf,我還可以使用strtol嗎?如何將我的代碼轉換爲使用getchar()putchar()而不是對I/O使用scanf()和printf()?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#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("> "); 
     scanf("%s", s); 

     if (imode == 0) {  /* Floating Mode */ 

      float val = strtof(s, &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, &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; 
} 

這是我迄今爲止對INT模式:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#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("> "); 
     //scanf("%s", s); 
     count = 0; 
     while ((count < 5) && (c != EOF) && (c !='\n')) { /* don't go over the array size! */ 
      s[count] = c; 
      ++count; 
      c = getchar();  /* get another character */ 
     }  

     //for (c=0; c<count; c++) { 
     //putchar(c); 
     //} 

     int val = strtol(s, &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 > bos){ 
     printf("Stack Full\n"); 
     return; 
    } 
    *p = i; 
    p++; 
} 

int pop (void) /* Get the element from the top of the stack */ 
{ 
    p--; 
    if(p < 0) { 
     printf("Stack Underflow\n"); 
     return 0; 
    } 
    return *p; 
} 
+0

你似乎使用了很多'printf()'...當你只允許使用'getchar()'和'putchar()'時允許使用嗎?當然,就使用'putchar()'來做輸出而言,你可以自己編寫像printf()這樣的函數的實現 - 實際上,這樣做可能是明智的。 – 2010-02-11 16:31:17

+0

該版本可能需要一個數組供棧使用:''int stack [MAX]; int * p = stack; int * bos = stack; int * tos = stack + MAX;''。 – 2010-02-11 16:41:36

回答

1

是否可以使用與strtol()或不取決於你的嵌入式系統。

C標準認可兩種環境。一個是正​​常的「託管」環境,它提供對C庫的全面支持。另一個是「獨立」環境。這隻有在C提供了7頭支持:

<float.h> 
<iso646.h> 
<limits.h> 
<stdarg.h> 
<stdbool.h> 
<stddef.h> 
<stdint.h> 

既然你是在嵌入式環境中,你可以依靠這些7.對於一切,你需要閱讀手冊爲您的環境。

這個機會很好,你可以用使用strtol()。

相關問題