проблема с вводом строки (с/с++)
столкнулась с такой проблемой: мне необходимо написать калькулятор постфиксной записи. Он есть, и работает. Но если попробовать не требовать ввод от пользователя выражения ( то есть не использовать
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 шт):
Я так думаю, раз у тебя парсится строка, то стандартный ввод вообще не надо использовать, а вывод только для результата или ошибки! Далее, я так понял, что "постфиксный калькулятор" для строки "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. Принцип работы "постфиксного калькулятора" вроде, сохранён.