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);
}