Mejoro sólo un poco más lo que leosansan ofrece:
Una expresion como esta:
Código C:
Ver originalwhile ((caracteres[j] = getche()) != '.' && j < 50)
considera el j < 50 para que cuando j sea 50 o mas no se esté escribiendo en el arreglo en una posicion más allá de sus límites.
C y C++ funcionan con "corta-circuito": en una secuencia de expresiones separadas por &&, la primera expresion que es falsa hace que el resto no se evalúe, por lo que conviene rotar el chequeo y escribirlo asi:
Código C:
Ver originalwhile (( j < 50 ) && (caracteres[j] = getche()) != '.' )
con ello, si j es 50 o mas, j <50 será falso, la asignacion que viene a continuacion no intentará hacerse siquiera y no se escribirá en caracteres[50].
En la expresion original, mostrada más arriba, lo primero que se hará será escribir en la posicion 50 para luego comprobar si era posible hacerlo, vale decir, ocurrirá corrupción/sobreescritura de memoria en ese caso.