簡體   English   中英

后綴函數錯誤的綴:控件可能到達非空函數的結尾

[英]Infix to postfix function error: control may reach end of non-void function

/ *這是將后綴表示法更改為后綴表示法的代碼。 我使用FILE / IO來獲取中綴符號,並且infix.txt文件看起來像

 3   
 2+4*2-1;  
 9+3^2^(3-1)*2;   
 2*((7-2)/3+4)^2%3;

我的問題是我在最后兩個函數icp和isp上“控制可能會到達非void函數的末尾”時出錯 我怎樣才能解決這個問題? * /

#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, &index); token!=';'; token=get_token(expression, &index)) {
        if(isdigit(token)) printf("%c", token);
        else if(token == ')') {
            while (stack[top] != '(') {
                element = pop(&top);
                printf("%c", element);
            }
            pop(&top);
        }
        else {
            while (isp(stack[top])>=icp(token)) {
                element = pop(&top);
                printf("%c", element);
            }
            push(&top, token);
        }
    }
    while((token=pop(&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;
    }
}

盡管您可能認為您的方法只會獲得這6個字符之一,但編譯器必須假定可以傳入任何字符。目前,如果您傳入,這些方法將不返回任何內容,例如'x'

您需要為所有未包含在開關中的字符指定default操作。 這是返回默認值還是引發異常,這取決於您。 但這仍然是您的代碼需要處理的可能性。

像這樣:

}//end switch
fprintf(stderr, "\nunrecognized OP(%c) is specified.\n", op);// '/', '^'...
return -1;//or exit(-1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM