¿Lo que falla en tu código?
Hay muchos signos de puntuación. Mejor si usaras isalnum para saber si un carácter es una letra/número o algo más.
Cuando usas gets para tomar una frase también copias el carácter de nueva línea. Si no lo eliminas de ella, que no lo haces, siempre tendrás que el último carácter de dicha frase nunca será igual al primero
Cuando copias frase2 a palin usas el mismo índice para los dos. Esto quiere decir que cuándo te saltas un signo de puntuación de los que has indicado en el if el contenido de palin en esa posición se quedará con un dato basura.
¿Qué quiere decir esto?
frase2: hola? soy yo
palin : 3klmQRjkla34
Y copias con tu código frase2 a palin
frase2: hola? soy yo
palin : holaQRsoyayo
Recuerda que las variables locales no se inicializan a 0.
De igual forma se te olvida marcar el final de la cadena palin con el carácter nulo.
En el while(lol<100), si dices que la cadena tiene como máximo 100 caracteres ¿cómo llegas al indice 100 para mostrarla letra a letra? deberías llegar hasta
i que es el largo calculado con strlen.