Ir para conteúdo
Fórum Script Brasil
  • 0

Erro de segmentation fault, não sei onde é.


huokkio

Pergunta

Então galera, sou novato no fórum me avisem se fiz algo errado, já pesquisei sobre mas não achei exatamente minha dúvida. Então to fazendo programação na faculdade, e tenho um trabalho para fazer uma calculadora polonesa. Ainda não tenho conhecimentos sobre ponteiros e nem funções por isso não utilizei no meu programa. O mesmo compila (compilador = gcc), mas quando digito qualquer equação ele dá um Segmentation Fault, que sei que é um problema relacionado a alocação de memória mas não tenho ideia de como resolver-lo nem como achá-lo, só sei que o mesmo está dentro de um if que criei na função que está sinalizado abaixo. Gostaria da ajuda de vocês. Segue o código:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main (){

	int vas, num_e=1;  // vassoura, número de equações
	char equacao[160],ch1,ch2; //2n-1 + /0.
	int cont1,cont3, cont2, lim, i=0, num1, num2,final=0,num3, numr;

	char res[3];
	char eq2[80],eq3[80],ch3[2];

	printf("Calculadora Polonesa:\nEste programa só aceita números de 0 à 9 e os operadores \"+,-,*,%%,/\". \n\n");
	printf("Para inserir uma equação, digite números de 0 à 9 e\ndepois os operadores todos separados por espaços. \n\n");
	printf("Digite \"exit\" para terminar o programa.\n\n");

		for (vas=1;;vas++){                                 
			printf("Insira a %dº equação: \n",num_e);
			gets(equacao);
			lim = strlen(equacao);
			for(cont3=1;cont3<lim;cont3+=2){      //TESTE DE ESPAÇOS NA EQUAÇÃO
				if (equacao[cont3]!=' '){
					printf("Erro. Partes da equação não estão separadas por um espaço.\n");
					strcpy(equacao,"");
					printf("Insira a %dº equação novamente: \n",num_e);
					gets (equacao);
					cont3=1;
				}
			lim = strlen(equacao);
			}
			if((equacao[0]=='e') && (vas==1)){
				printf("Encerrando o programa...\n");
				break;
			}
			if((equacao[0]=='e') && (vas>1))
				break;
			for(cont3=0;cont3<lim;cont3++){    //For para imprimir a equação de entrada
				printf("%c",equacao[cont3]);
			}
				for (cont1=0; cont1<lim; cont1++){             //RESULOÇÃO DA EQUAÇÃO NESTE FOR
					lim = strlen(equacao);
					ch3[0] = equacao[cont1];
					num3 = atoi(ch3);

					if (((num3>57) || (num3<48)) && equacao[cont1]!=' ') { //O PROBLEMA ESTÁ NESSE IF...LEU UM SINAL, E PEGA OS 2 NÚMEROS ANTERIORES.
						
						ch1 = equacao[cont1-2];  		//Convertendo caracteres para inteiro
						ch2 = equacao[cont1-4];
						num1 = ch1-48;
						num2 = ch2-48;

						switch (equacao[cont1]){
	
							case '+':
								numr=num1+num2;
								break;
							case '-':
								numr=num2-num1;
								break;
							case '*':
								numr=num1*num2;
								break;
							case '/':
								numr=num2/num1;
								break;
							case '%':
								numr=num2%num1;
								break;
						}
						cont2=0;
						while(cont2<(cont1-4)){      			//Copiando a parte inicial da equação para eq2(antes do sinal)
							eq2[cont2]=equacao[cont2];
							cont2++;
						}
						cont2=(cont1+1);						//Copiando a parte final da equação(após o sinal)
						while(cont2<lim){
							eq3[i]=equacao[cont2];
							i++;
						}
						res[0]=numr+48;

						strcat(eq2,res);           //Concatenando a parte inicial da equação mais o resultado da operação realizada
						strcat(eq2,eq3);	       //Concatenando parte inicial + resultado + parte final
						strcpy(equacao,"");		   
						strcpy(equacao,eq2);		//Copiando nova equação concatenada para a principal
						
						strcpy(eq2,"");				// Zerando strings
						strcpy(eq3,"");
						cont1=0;
						i=0;						//zerando tudo para para repetir o for
						}
				}
			printf("   =  %c\n",equacao[0]);
			final += atoi(equacao);   //SOMANDO AO RESULTADO FINAL
			num_e++;
		}
		if ((vas>1) && (equacao[0]=='e'))
			printf("O resultado final é: %d\n",final);
}

=========================================================

AVISO: Favor postar as suas duvidas no Forum Principal ( C, C++ )

 

Editado por Jhonas
Regras do Forum
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...