El programa tal como esta no funcionara correctamente por varios errores críticos.
No quiero sonar como un [CENSORED] de lo mas pedante pero creo que acabas de romper todas (o casi todas) las recomendaciones del tema
|Lo que no hay que hacer en C/C++. Nivel basico|. Espero no lo tomes a mal (solo es un comentario con humor).
Lo primero (si es posible) es cambiar de compilador por uno mas reciente y actualizado, recomendaciones hay muchas, solo tienes que usar el motor de búsqueda de los foros.
En cuanto al programa los errores mas importantes son utilizar las variables "nom" y "num" sin antes asignarles un valor (la dirección en memoria retornada por malloc, calloc o realloc). Al no hacerlo el valor inicial de ambas variables es NULL.
En cuanto a los bucles una forma mejor es verificar cada carácter. Aquí tienes el problema del espacio blanco antes y después de un numero así como el espacio intercalado en nombres compuestos como "Jose Maria".
Bueno, comparas cada carácter y si es valido continuas. Con ello al terminar el bucle basta con revisar si el ultimo carácter procesado es el '\0'. Si es así la cadena es valida.
Poco mas o poco menos (para el nombre):
;
if (nom[i] == '\0'){
/* La cadena es valida */
}else {
/* No lo es */
}
Un saludo