Entrecomillando una cadena has dado un paso pero sigues teniendo un fallo.
Un poco de teoría: Los lenguajes de programación, al menos antes de la era de la programación orientada a objetos, tenían el problema de saber dónde termina una cadena de texto. Nosotros entendemos las palabras, pero la máquina no; para ella son sólo una secuencia de números en una sección de su memoria lineal. Pero ¿dónde termina?
Para resolver el problema los diseñadores pensaron en dos soluciones totalmente diferentes pero totalmente funcionales:
1. El tamaño de la cadena lo marcaba el primer byte de ésta. Como pro no se necesitaba calcular el tamaño pues ya lo daba la cadena misma; por contra una cadena no podía superar los 255 caracteres.
2. Marcar la cadena con un carácter especial que no será usado en otra situación. Como pro una cadena puede ser tan larga como el programador necesita; por contra el tamaño debe ser calculado programáticamente, hay un carácter que no puede ser usado en los textos y el auténtico tamaño del array de caracteres es un byte más largo a lo que el programador escribe, por ese mismo carácter.
C usa la segunda opción.
Cuando tu escribes una cadena de esta forma
lo que C hace por debajo es
{'H', 'O', 'L', 'A', '\0}
es decir, prepara un array con las letras que le has dado entrecomilladas y agrega el carácter nulo, que vale 0 (cero) en decimal, para marcar el final de la cadena. Esa es la base de todas las funciones que trabajan con cadenas.
Por tanto cuándo defines un array para alojar una cadena y debes darle las dimensiones a mano piensa que debes sobredimensionar a 1 elemento más que el número de letras tiene la cadena.
Por tanto debes redimensionar tus arrays de palabras para poder alojar el carácter nulo.