c - 如何将我的代码转换为使用 getchar() putchar() 而不是使用 scanf() 和 printf() 进行 I/O?

标签 c getchar

我需要使用 getchar()、putchar() 进行 I/O。我的程序工作得很好,但我不能像在嵌入式系统的 CodeWarrior 中那样使用它。我还需要摆脱 malloc() 并只使用堆栈进行弹出/推送。如果我不再使用 scanf,我还能使用 strtol 吗?

#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;
}

最佳答案

是否可以使用 strtol() 取决于您的嵌入式系统。

C 标准识别两种环境。一种是正常的“托管”环境,它为 C 库提供全面支持。另一个是“独立式”环境。那只需要为 C 中的 7 个 header 提供支持:

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

由于您处于嵌入式环境中,因此您可以依赖这 7 个。对于其他所有内容,您需要阅读您的环境手册。

很有可能您可以使用 strtol()。

关于c - 如何将我的代码转换为使用 getchar() putchar() 而不是使用 scanf() 和 printf() 进行 I/O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2245826/

相关文章:

c - 重复直到用户按下 Enter 键

c - 我的程序不接受 scanf 命令的输入

C - 传递结构指针会终止程序?如何

c - 在 c : segmentation fault 中实现 BST

c - 将 void 指针传递给函数指针

c - vector 的长度,初学者

c - 程序控制流程未按预期工作

c - 改进 Makefile,使其仅创建和清理已更改/特别请求的程序

c - 在 while 循环中等待在 C 中按 Enter 键?

c - 为什么在 Ubuntu 14.10 中需要按 CTRL+D 两次才能突破 `while ((c=getchar())!=EOF)`?