проблема с вводом строки (с/с++)

столкнулась с такой проблемой: мне необходимо написать калькулятор постфиксной записи. Он есть, и работает. Но если попробовать не требовать ввод от пользователя выражения ( то есть не использовать

 int c = getchar();

) , а записать это в следующем виде, то все ломается. Вроде все делаю правильно, но все равно не работает Подскажите пожалуйста, как это исправить

    #include <stdio.h>
int main()
{
    int stack[1000];
    char sendBuff[] =  "1 2 3 4 + * + =";
    // sp = индекс ячейки, куда будет push-иться очередное число
    int sp =0;
    while ( !feof(stdin) ) {
        for(int i =0; i<sizeof(sendBuff[i]); i++){
        int  c = sendBuff[i];
        int x;
        switch (c) {
            case  ' ':
            case '\n':
                break;
            case '=':
                printf("Result = %d\n", stack[sp - 1]);  sp--;
                break;
            case '+':
               stack[sp-2] = stack[sp-2] + stack[sp-1];  sp--;
               break;
            case '-':
               stack[sp-2] = stack[sp-2] - stack[sp-1];  sp--;
               break;
            case '*':
               stack[sp-2] = stack[sp-1] * stack[sp-2];  sp--;
               break;
            case '/':
              stack[sp-2] = stack[sp-2] / stack[sp-1];   sp--;
               break;
            default:
                ungetc (c, stdin); // вернуть символ обратно в поток
                if (scanf("%d", &x) != 1) {
                    fprintf(stderr, "Can't read integer\n");
                    return -1;
                } else {
                    stack[sp] = x;                       sp++;
                }
        }
    }
    printf("Result = %d\n",stack[sp-1]);
    return 0;
}
}

Ответы (1 шт):

Автор решения: Dmitry Safonov

Я так думаю, раз у тебя парсится строка, то стандартный ввод вообще не надо использовать, а вывод только для результата или ошибки! Далее, я так понял, что "постфиксный калькулятор" для строки "1 2 3 4 + * + =" работает следующим образом: result = ((4 + 3) * 2) + 1? В таком случае вот так может быть модифицирован код, чтобы всё заработало:

#include <stdio.h>
#include <ctype.h> 

int main()
{
    int i = 0;
    int stack[1000];
    char sendBuff[] =  "1 2 3 4 + * + =";
    char ch;
    int sp =0;

    while (ch = sendBuff[i]) {
        switch (ch) {
            case  ' ':
            case '\n':
                break;
            case '=':
                printf("Result = %d\n", stack[sp - 1]);  
                sp--;
                break;
            case '+':
                stack[sp-2] = stack[sp-2] + stack[sp-1];
                sp--;
                break;
            case '-':
                stack[sp-2] = stack[sp-2] - stack[sp-1];
                sp--;
                break;
            case '*':
                stack[sp-2] = stack[sp-1] * stack[sp-2];
                sp--;
                break;
            case '/':
                stack[sp-2] = stack[sp-2] / stack[sp-1];
                sp--;
                break;
            default:
                if (!isdigit(ch)) {
                    fprintf(stderr, "Can't read integer\n");
                    return -1;
                } 
                else {
                    stack[sp] = ch - '0';
                    sp++;
                }
        }
        i++;
    }
    return 0;
}

Примечание: stack[sp] = ch - '0'; Таким хитрым способом можно char цифру (символ) преобразовать в int. Принцип работы "постфиксного калькулятора" вроде, сохранён.

→ Ссылка