#c #compiler-errors #stack #postfix-notation #infix-notation
#c #ошибки компилятора #стек #postfix-нотация #инфиксная нотация
Вопрос:
/* Это код, который изменяет инфиксную нотацию на постфиксную нотацию. Я использовал FILE / IO для получения инфиксных обозначений и infix.txt файл выглядит следующим образом
3
2 4*2-1;
9 3^2^(3-1)*2;
2*((7-2)/3 4)^2%3;
Мой вопрос в том, что я получаю сообщение об ошибке «управление может достичь конца функции, не являющейся недействительной», для последних двух функций, icp и isp. Как я могу это исправить?
*/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX_SIZE 100
#define ENTER 0x000d
void infixtopostfix(char expression[]);
char get_token(char expression[], int *index);
void push(int *top, char token);
int pop(int *top);
int icp(char op);
int isp(char op);
char stack[MAX_SIZE];
int main(void) {
int i, num;
FILE *file;
char expression[MAX_SIZE];
if((file=fopen("infix.txt","r")) == NULL) {
printf("No file.n");
}
fgets(expression, MAX_SIZE, file);
num = atoi(expression);
for(i=0; i < num; i ) {
fgets(expression, MAX_SIZE, file);
printf("%s", expression);
infixtopostfix(expression);
}
fclose(file);
}
void infixtopostfix(char expression[]) {
char token;
char element;
int top=0;
int index=0;
for(token=get_token(expression, amp;index); token!=';'; token=get_token(expression, amp;index)) {
if(isdigit(token)) printf("%c", token);
else if(token == ')') {
while (stack[top] != '(') {
element = pop(amp;top);
printf("%c", element);
}
pop(amp;top);
}
else {
while (isp(stack[top])>=icp(token)) {
element = pop(amp;top);
printf("%c", element);
}
push(amp;top, token);
}
}
while((token=pop(amp;top))!=0) printf("%c", token);
printf("n");
}
char get_token(char expression[], int *index) {
char token=expression[(*index) ];
return token;
}
void push(int *top, char data) {
if(*top < (MAX_SIZE-1)) stack[ (*top)] = data;
}
int pop(int *top) {
if(*top > -1) return stack[(*top)--];
else return 0;
}
int icp(char op) {
switch (op){
case '(' : return 20; break;
case ' ' : return 12; break;
case '-' : return 12; break;
case '*' : return 13; break;
case '%' : return 13; break;
case ';' : return 0;
}
}
int isp(char op) {
switch (op){
case '(' : return 0; break;
case ' ' : return 12; break;
case '-' : return 12; break;
case '*' : return 13; break;
case '%' : return 13; break;
case ';' : return 0;
}
}
Комментарии:
1. Что делать, если
op
в инструкциях нет ничего из того, что вы проверяетеswitch
? Что вы тогда возвращаете? Функция всегда должна возвращать значение, если она была объявлена для возврата чего-либо.2. Да, и, кстати: Если вы создаете какой-либо синтаксический анализатор для введенных пользователем данных, вы должны иметь возможность обрабатывать незаконный, ошибочный или иной странный ввод.
Ответ №1:
Хотя вы можете полагать, что ваши методы будут получать только один из этих 6 символов, компилятор должен предполагать, что может быть передан любой символ. На данный момент эти методы ничего не вернут, если вы передадите, например, 'x'
.
Вам необходимо указать default
действие для всех символов, которые иначе не покрываются вашим коммутатором. Возвращает ли это значение по умолчанию или генерирует исключение, зависит от вас. Но, тем не менее, это возможность, с которой ваш код должен справиться.
Ответ №2:
вот так:
}//end switch
fprintf(stderr, "nunrecognized OP(%c) is specified.n", op);// '/', '^'...
return -1;//or exit(-1);