Il sorgente presenta molti problemi, anche dal punto di vista della logica ... perche' convertire i caratteri in int quando e' possibile operare direttamente con loro ?
E poi ci sono degli errori come
scanf("%s",&num);
in cui &num e' sbagliato perche' il nome dell'array di char e' gia' un puntatore. Quindi
scanf("%s", num);
Ti propongo un mio esempio. Tieni conto che in questo esempio l'input non e' controllato.
In ingresso si presuppone ci siano due stringhe numeriche di massimo 20 cifre e la prima deve essere maggiore o uguale rispetto alla seconda ...
Se vuoi, puoi aggiungere i controlli relativi, se devi farlo ...
codice:
#include <stdio.h>
#include <string.h>
void RAlign(char *s)
{
int ix;
ix = strlen(s);
strncpy(s+(20-ix), s, ix);
s[ix]='0';
strnset(s, '0', 20-ix);
s[20]=0;
}
void RemoveRZero(char *s)
{
int ix;
for(ix=0; ix<19; ix++)
if(s[ix]=='0')
s[ix]=' ';
else
break;
}
int main(int argc, char *argv[])
{
int ix, cy;
char numA[21];
char numB[21];
char res[21];
// Input (nessun controllo sull'input e A>=B)
printf("Inserisci il primo numero\n");
scanf("%s", numA);
printf("Inserisci il secondo numero\n");
scanf("%s", numB);
// Allinea a destra valori
RAlign(numA);
RAlign(numB);
// Azzera risultato
for(ix=0; ix<20; ix++)
res[ix]='0';
res[ix]=0;
// Esegue operazione
cy = 0;
for(ix=19; ix>=0; ix--)
{
res[ix]= numA[ix] - numB[ix] + '0' - cy;
cy = 0;
if(res[ix] < '0')
{
res[ix]=res[ix]+10;
cy=1;
}
}
// Sostituisce zeri iniziali con blank
// dai valori e dal risultato
RemoveRZero(numA);
RemoveRZero(numB);
RemoveRZero(res);
// Mostra operazione e risultato
printf("\n\n%s -\n%s =\n--------------------\n%s\n", numA, numB, res);
// Termina
return(0);
}