Vale, unas cuantas cosas que no tienes claras:
Un array de 1 elemento es una redundancia, por tanto donde pone
char texto1[40],letra[1];
debe poner
char texto1[40],letra;
Los arrays en C empiezan en el índice 0, no el 1. Así pues donde pone
texto[1] = letra[1]
debe poner
texto[0] = letra[0];
pero como hemos dicho que letra es un simple char la línea debe ser así:
texto[0] = letra
Un fallo que has realizado es en la linea
porque estas cargando toda una cadena donde solo te cabe un caracter. Además el fallo es más grave porqué estás escribiendo fuera de la memoria asignada para letra (solo tienes asignado letra[0], escribir en letra[1] es escribir fuera de los límites de la variable). Además hay que recordar que letra lo hemos dejado como caracter por tanto debería escribirse todo de esta forma:
o mejor aún haciendo uso de getchar así: