#include<stdio.h>

#define MIDA	80
#define BASEMAX	16
#define BASEMIN	2

void canvi_base(char vi[MIDA], int bi, char vo[MIDA], int bo) {
	int i, n, l, aux;

	// Calculo que numero es vi que viene dado en base bi -> n
	for(i=0,n=0;vi[i]!='\0';i++) {
		n = n*bi;
		if ((vi[i]>='0')&&(vi[i]<='9')) n = n+vi[i]-'0';
		else if ((vi[i]>='A')&&(vi[i]<='F')) n = n+vi[i]-'A'+10;
		else if ((vi[i]>='a')&&(vi[i]<='f')) n = n+vi[i]-'a'+10;
	}
	printf("\t(en base 10 es %d)\n", n);
	// Lo escribo en base bo pero en el vector vo queda al reves.
	for(i=0;n!=0;i++) {
		vo[i] = n % bo;
		if (vo[i]>9) vo[i]=vo[i]-10+'A';
		else  vo[i]=vo[i]+'0';
		n = n / bo;
	}
	l=i;
	vo[i]='\0';
	// Invierto el vector
	for(i=0;i<l/2;i++) {
		aux = vo[i];
		vo[i] = vo[l-1-i];
		vo[l-1-i] = aux;
	}
}

int main() {
	char vi[MIDA], vo[MIDA];
	int bi, bo, i;
	char c;

	printf("Conversio de nums de qualsevol base a qualsevol base (de base %d a base %d)\n",
			BASEMIN, BASEMAX);
	printf("Intro num en qualsevol base: ");
	for(i=0;c!='\n';i++) {
		scanf("%c", &c);
		vi[i] = c;
	}
	vi[i-1] = '\0';
	do {
		printf("En quina base esta? ");
		scanf("%d", &bi);
	} while (bi < BASEMIN || bi > BASEMAX);
	do {
		printf("A quina base el vols convertir? ");
		scanf("%d", &bo);
	} while (bo < BASEMIN || bo > BASEMAX);
	canvi_base(vi, bi, vo, bo);
	printf("%s en base %d\n", vi, bi);
	printf("es %s en base %d\n", vo, bo);
}

/*
 * Se podria compilar con
 * gcc t4_canvi_base.c -O2 -Wall -Wno-unused-result
 * Para ver todos los warnings menos los del tipo:
 * t4_canvi_base.c:44:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
 *    scanf("%c", &c);
 *    ^~~~~~~~~~~~~~~
 */

