Creo que no te has fijado bien en el punto y coma ";" después del while. Este es el que "obliga" al programa a esperar el ENTER para cerrar.
el ";" no es para nada mas que para acabar el bloque del while sin ninguna sentencia dentro de el.
esto se hace para limpiar el bufer de entrada stdin. se ha comentado muchas veces en el foro pero lo repetire una vez mas. funciones como scanf() dejan basura en el bufer de entrada. si lo usas para leer un entero, e introduces por ejemplo "23ab", scanf() leera el "23" y el "ab\n" se quedara en el bufer de entrada. usando esta sentencia del while, limpias el bufer ya que descarta los caracteres hasta encontrarse el de salto de linea, el cual tambien lo descarta. asi luego puedes usar otras funciones como fgets() sin problemas.
En la parte del for(i = 0; cadena != '\0'; ++i);
Por qué pones el punto y coma al final? Según mi libro al final del -for- no debería ir eso.
es el mismo caso que antes. cuando el for tiene sentencias dentro de el se usan "{}", en cambio si no tiene ninguna sentencia dentro tienes que indicar de alguna manera que el for se acaba, y se hace con ";". de hecho, tambien podrias hacerlo asi:
for(i=0; cadena!='\0'; i++){}
o incluso asi:
for(i=0; cadena!='\0'; i++){};
y todas funcionarian.
un saludo!