Te cuento el uso de gets porque fgets me arroja ' \n ', ya me avisaste hace un tiempo de este mal uso.
Nada impide que elimines el avance de linea mediante la función strchr (prototipo en <string.h>) o un bucle.
No obstante he visto ahora algo por encima pero tengo que verlo con más detalle como trabajan ya que se me queda colgado el código
Ese programa funciona correctamente, si el programa en un momento dado se congela asegúrate de publicar la versión tal cual, sin cambios.
Las indicaciones que me has puesto creo que son con punteros ya que me indicas direcciones, pero aún no he llegado a ese tema [...] te cuelgo lo que he modificado del programa pero me gustaría me guiaras también para hacerlo sin punteros.
No es posible por lo siguiente:
1) Todo parámetro de una función declarado en la forma "T identificador[N]" se procesa en realidad como "T *identificador", en otras palabras cada parámetro declarado como array se procesa como un puntero.
2) El operador "[]" requiere de dos operandos: un entero y un puntero sin importar el orden, cuando uno de ellos es el nombre de un array este genera de forma automática el puntero necesario.
Como espero entenderás no hay escape: se utilizan punteros (direcciones de memoria) si o si.
Un saludo