APUNTADORES.c



// USO DE APUNTADORES, CADENAS, VECTORES
/*
	DADA UNA OPERACION COMO CADENA DE TEXTO
	(1) SE REALICE LA OPERACION Y MUESTRE EL RESULTADO
		(a) # + #	ó	#+#
		(b) # - #	ó	#-#
	(2) O BIEN OPERE CON SUB CADENAS DE LA CADENA DE ENTRADA
*/

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

int EsMas(char Letra) { return Letra=='+'; }
int EsMenos(char Letra) { return Letra=='-'; }
int EsEspacio(char Letra) { return Letra==' '; }

int EsOperador(char Letra)
{ return EsMas(Letra) || EsMenos(Letra); }

void leenumero(char *N, char *CAD)
{
	char *Num = malloc(10);
	char *A = malloc(10);
	strcpy(A, CAD);
	
	strcpy(Num, "");
	//A= "23 + 56"
	while( A[0] )	// se ejecuta hasta encontra el '3'
	{
		if ( isdigit(A[0]) ) sprintf(Num, "%s%c", Num, A[0]);	// Num= "23"
		if ( EsOperador(A[0]) || EsEspacio(A[0]) )
			{ if ( EsEspacio(A[0]) ) A++; break; }
		A++;
	}
	strcpy(CAD,A);
	strcpy(N,Num);
}

int leeOperador(char *CAD)
{
	char Opr;
	char *A = malloc(10);
	strcpy(A, CAD);

	while( A[0] )
	{
		if ( EsOperador(A[0]) ) { Opr = A[0]; A++; break; }
		A++;
	}
	strcpy(CAD, A);
	return Opr;
}

int operacion(int n1, char opr, int n2)
{
	switch (opr)
	{
		case '+':	return n1+n2; break;
		case '-':	return n1-n2; break;
	}
}

void parser(char *A)
{
	char *num1,*num2, Opr;
	num1 = malloc(10); num2=malloc(10);

	leenumero(num1, A);
	Opr = leeOperador(A);
	printf("Num1= %s\n", num1);
	printf("Opr = %c\n", Opr);
	printf("A= %s\n", A);
	strcpy(num2, A);
	printf("Num2= %i\n", atoi(num2));
	printf("%s %c %s = %i\n", num1, Opr, num2, operacion(atoi(num1), Opr, atoi(num2)));
}

int main(int a, char **A) { if ( a==2 ) parser(A[1]); else printf("debe ser un argumento ...\n"); }