gpt4 book ai didi

c - 中缀到后缀函数错误 : control may reach end of non-void function

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:14 26 4
gpt4 key购买 nike

/*这是将中缀表示法更改为后缀表示法的代码。我使用 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, &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'.

您需要为您的开关未涵盖的所有字符指定一个默认 操作。这是返回默认值还是抛出异常,这取决于您。但这仍然是您的代码需要处理的可能性。

关于c - 中缀到后缀函数错误 : control may reach end of non-void function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40067867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com