Acerca del ignore: Cuando haces "cin << int", como el salto de línea que introduces no es una cifra, lo deja en el stream de entrada, con lo cual hay que ignorarlo manualmente. Una opción es leer siempre con getline y transformar a un número con, por ejemplo, stoi():
http://www.cplusplus.com/reference/string/stoi/Podrías hacer una función que llamarías: "readInt(cin)" por ejemplo.
Acerca del segundo problema, te cito la referencia de la función getline, en el apartado en el que explica la variable "n", el tamaño del buffer:
http://www.cplusplus.com/reference/istream/istream/getline/If the function stops reading because this limit is reached without finding the delimiting character, the failbit internal flag is set.
Por lo tanto, "cin" se colocará en un estado de error. Esto hace que cualquier intento de leer entrada por ahí falle (de ahí que no te vuelva a preguntar nada). Si quieres saber si falló por esto, comprueba la flag "fail": "if(cin.fail())".
Para que el stream vuelva a funcionar de manera natural, "cin.clear()", que limpia esas flags.
Aquí, como opinión personal, te diría que en lo posible, intentes evitar trabajar con arrays de caracteres y trabajes siempre con strings. Si quieres limitar el tamaño de una string a 20, basta que hagas un "substring(0, 20)" para truncarla. No es que los arrays de char sean malos, pero puedne complicar un poco las cosas. Evidentemente, si estás trabajando con ellos por practicar o algo así, no problem.