visto che si tratta di una stringa devi controllare
un carattere alla volta
se è una lettera o un numero se sono tutti numeri allora trattasi di numero

io ho provato per esercizio a fare una funzione che
riconoscesse se si tratta di numero o di stringa
comunque ha delle limitazioni considera solo numeri interi senza virgola
non usa come ti è stato chiesto malloc e allocazione dinamica
è solo un esempio ma fa un po di piu del codice che hai postato tu


codice:
#include <stdio.h>
#include <stdlib.h>
int controllo(char *c);

int main(int argc, char *argv[])
{
  int  i= controllo("213478");
  if (i==1)
    puts("è un numero");
  else
     puts ("e una stringa");
  system("PAUSE");	
  return 0;
}


int controllo(char *c)
{
    int i,j=strlen(c);
    int numeri_presenti=0;
    for(i=0;i<j;i++)
    {
        if(c[i]>=48 && c[i]<=57) // se il carattere è compreso tra 1 e 9  ascii
                numeri_presenti++;
         
        
        }
        
     if(numeri_presenti==j){//se uguale numero caratteri 
         
          return 1; // la stringa è un numero
      }    
      else 
          return 0; // la stringa contiene altri caratteri             
	
}