Veo que usas las funciones de entrada y salida de la librería estándar (como getchar) así como las de flujos (usando los operadores sobrecargados << y >>).
Yo siempre uso los de la librería estándar pues no me he acostumbrado a usar los de flujos, pero creo (no estoy seguro) haber leído en alguna parte que no es aconsejable mezclarlos, espero que alguien que sepa algo más al respecto nos aclare este punto. De cualquier manera no creo que esté el error ahí. Las funciones de entrada y salida estándar así como la de flujos estándar he visto que están más enfocadas a entrada y salida de archivos y a interconecciones o tuberías (por ejemplo cuando desde la línea de comandos o consola usas los caracteres <, >, >>, <<, | entre programas y archivos) y no tanto a una interacción entre el programa y el usuario. Cuando, como en este caso, tengo que pedir datos al usuario para que los introduzca por el teclado, prefiero usar funciones no estándar proporcionadas por el compilador pero tener más control en el programa.