Итак, я создал программу, которая преобразует инфикс в пост-фикс и префикс, который отлично работает. Дело в том, что я использую C-LION у которого есть свой отладчик, который позволяет мне идти шаг за шагом, и я делаю, что программа работает нормально и выводит ожидаемые результаты, НО затем, когда я запускаю ее нормально, ОНА НЕ РАБОТАЕТ И ДАЕТ МНЕ ОШИБКА "main.c не работает".
Это основная функция, которая имеет меню:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <tgmath.h>
char*infixToPostfix(char *infinx);
char* postixToinfix(char *infinx);
char* postixToprefix(char *infinx);
char* prefixToinfix(char *infinx);
char* prefixTopostfix(char *infinx);
char* infixToPrefix(char *infinx);
char*evaluate(char *infinx );
int exp_det(char*exp);
typedef struct node
{
char *op;
int p;
struct node *next; /* Pointer to the next node. Notice that the
existence of the structure tag enables us to declare its type. */
} node;
node *head=NULL; /* Global pointer that always points to the head of the
stack. */
int precedence(char symbol);
void add_stack(const node *p);
void pop(void);
int main(void)
{
char postfix[100];
int choice;
//converting from ininfinx to postfix
printf("\t\t***** Conversion Calculator 1.0 ******\t\t\n");
printf("\t\t1.Convert\n\t\t2.Evaluate\n\t\t3.Exit\nEnter Choice : ");
scanf("%d",&choice);
//switch (choice){
if (choice==1) {
printf("\n\t\t1.Input from File\n\t\t2.standered input\nEnter Choice :");
int ch2;
scanf("%d", &ch2);
switch (ch2) {
case 1:
printf("FILE MANGAMENT STILL NOT DONE !!!");
break;
case 2:
printf("Enter Expression : ");
char line[256];
scanf(" %[^\n]s", postfix);
char in2[100] = {'\0'};
char in3[100] = {'\0'};
char *conv;
char *conv2;
strcpy(in2, postfix);
strcpy(in3, postfix);
int exp = exp_det(in2);
if (exp == 1) {
printf("\nThis is a Prefix expression do you want to\n\t\t1.Infix\n\t\t2.Postfix\n\t\t3.Both\nEnter Choice :");
int ch3;
scanf("%d", &ch3);
switch (ch3) {
case 1:
conv = prefixToinfix(in3);
printf("Expression in Infix form: %s \n", in3);
break;
case 2:
conv = prefixTopostfix(in3);
printf("Expression in Postfix form: %s \n", in3);
break;
case 3:
conv = prefixToinfix(in3);
conv2 = prefixTopostfix(postfix);
printf("Expression in Infix form: %s \n", conv);
printf("Expression in Postfix form: %s \n", conv2);
break;
default:
printf("ERROROR WHEN EXPRESSION IN PREFIX ");
break;
}
} else if (exp == 2) {
printf("\nThis is a Infix expression do you want to\n\t\t1.Prefix\n\t\t2.Postfix\n\t\t3.Both\nEnter Choice :");
int ch3;
scanf("%d", &ch3);
switch (ch3) {
case 1:
printf("Expression in prefix form: %s \n", infixToPrefix(postfix));
break;
case 2:
printf("Expression in Postfix form: %s \n", infixToPostfix(postfix));
break;
case 3:
printf("Expression in prefix form: %s \n", infixToPrefix(postfix));
printf("Expression in Postfix form: %s \n", infixToPostfix(postfix));
break;
default:
printf("ERROROR R");
break;
}
} else if (exp == 3) {
printf("This is a Postfix expression do you want to\n\t\t1.Infix\n\t\t2.Prefix\n\t\t3.Both\nEnter Choice :");
int ch3;
scanf("%d", &ch3);
switch (ch3) {
case 1:
printf("Expression in Infix form: %s \n", postixToinfix(postfix));
break;
case 2:
printf("Expression in prefix form: %s \n", postixToprefix(postfix));
break;
case 3:
printf("Expression in Infix form: %s \n", postixToinfix(postfix));
printf("Expression in Prefix form: %s \n", postixToprefix(postfix));
break;
default:
printf("ERROR... 3:(\n");
break;
}
}
break;//for the switch with ch2 case 1
default:
printf("ERROR... 2:(\n");
break;
}
//break;
}if(choice==2) {
printf("Enter Expression : ");
scanf(" %[^\n]s", postfix);
char in2[100] = {'\0'};
char in3[100] = {'\0'};
char *conv;
char *conv2;
strcpy(in2, postfix);
conv = evaluate(in2);
printf("\nExpression evaluated = %s \n", conv);
//break;
}if(choice==3) {
printf("BYE...... :D\n");
}
system("PAUSE");
}
OK Теперь, после долгих испытаний, я начинаю думать, что проблема в самой конвертации. Это одна из функций, которые я использую, для меня это выглядит нормально. Если у кого-то есть другое мнение, помощь очень приветствуется.
char* infixToPostfix(char *infinx){
char* token;
char * infinx1=malloc(sizeof(infinx)+1);
infinx1=strcpy(infinx1,infinx);
token = strtok(infinx1," ");
char* res;
res=malloc(sizeof(infinx)+sizeof(head->op)*strlen(infinx));
strcpy(res," ");
if(*token=='\n' ){token=strtok(NULL," ");}
while( token != NULL ) {
node n;
n.op=token;
n.p=precedence(*token);
if(isalpha(*token) || isdigit(*token)){
// strcat(result,infinx[i]);
//printf("%c",infinx[i]);
res=strcat(res,token);
res=strcat(res," ");
}
//case when encounter a left paranthessisis
else if(*token=='(' || *token==')'){
if (*token=='('){
add_stack(&n);
}else if(*token==')') {
while (*head->op != '(') {
// strcat(result, n.op);
//printf("%c",(char)head->op);
res=strcat(res,head->op);
res=strcat(res," ");
pop();
}
pop();
}
}
//if head if null meaning the stack is empty or if the presendance of the head is less thatn or equal to new character
else if(head==NULL || head->p < n.p ){
if (head->p == n.p){}
add_stack(&n);
}
//in case the head has higher presendance he we pop and print untill we reach the same presedance
else {
while( head!=NULL && head->p >= n.p){
//strcat(result,n.op);
//printf("%c",(char)head->op);
res=strcat(res,head->op);
res=strcat(res," ");
pop();
}
add_stack(&n);
}
token=strtok(NULL," ");
}
while(head!=NULL){
//strcat(result,head->op);
//printf("%c",(char)head->op);
res=strcat(res,head->op);
res=strcat(res," ");
pop();
}
return res;
}
ch2 == 2
какие-то переменные объявлены, а еслиexp == 1
иch3 == 3
они могут быть использованы? И у вас есть несколько переменныхch3
, чтобы полностью запутать нас. Я не удивлюсь, если ваш компилятор тоже запутается. - person Bo Persson   schedule 19.12.2017"main.c not working "
- возможно, main.c бастует? или праздник? - person 0___________   schedule 19.12.2017scanf(" %[^\n]s", postfix);
это не сработает. Поскольку ввод не будет иметь «буквального»s
в качестве первого символа в следующей строке ввода, И новая строка еще не используется. Также обратите внимание, что%[...]
не ограничивает количество вводимых символов, поэтому может переполнить входной буфер. Всегда используйте модификатор MAX CHARACTERS, который на единицу меньше длины входного буфера. На один меньше, потому что этот спецификатор входного формата всегда добавляет к буферу байт NUL. Предложите использовать:scanf(" %99[^\n]", postfix);
- person user3629249   schedule 19.12.2017scanf()
всегда проверяйте возвращаемое значение (а не значения параметров), чтобы убедиться, что операция прошла успешно. - person user3629249   schedule 19.12.2017system("PAUSE");
Эта команда оболочки «ПАУЗА» не является переносимой, поскольку она не реализована в ОС *unx. - person user3629249   schedule 19.12.2017enum
для значений ответов меню Предложите использовать оператор#define
для 100 - person user3629249   schedule 19.12.2017typedef
для этой структуры. Довольно грязно объявлять глобальные данные в середине освещенных прототипов. Предлагайте определение структуры, typedef для этой структуры и объявление экземпляра структуры перед списком прототипов. - person user3629249   schedule 19.12.2017system("PAUSE");
: Это может быть гораздо более переносимо записано как:int ch; while( (ch = getchar()) != EOF && '\n' != ch ); getchar();
- person user3629249   schedule 19.12.2017malloc(sizeof(infinx)+sizeof(head->op)*strlen(infinx));
странная. Я не понимаю, почему вы делаете первоеsizeof
, второе верно, но я думаю, что это скорее счастливая случайность. Что именно вы пытаетесь сделать здесь? - person Pablo   schedule 13.01.2018