Non saprei, ma di sicuro non devi fare
codice:
input.clear();
input.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
così a caso, dal momento che, se la lettura è stata completata correttamente, questa linea fa sì che il programmi si blocchi ad aspettare una nuova linea di testo per poi ignorarla. Piuttosto fai:
codice:
if(!input)
{
    input.clear();
    input.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
. In ogni caso i problemi che si affrontano con questo approccio di svuotamento del buffer tendenzialmente sono determinati da un'impossibilità di convertire il testo inserito dall'utente nel tipo di dati richiesto, problema che non si pone qui visto che stai acquisendo una stringa.

Il mio consiglio comunque è di lasciare stare le stringhe C, almeno per l'input (danno più rogne che altro), e di utilizzare le stringhe C++ e la funzione getline. Per acquisire dati non di tipo stringa, invece, cerca nel forum la mia funzione template AcquireInput, che si occupa anche di ripulire lo stream e di chiedere nuovamente l'inserimento se qualcosa va storto.