Hola a todos, tengo que hacer un programa que identifique las frases palíndromas. Tengo este código, pero falla en el if al comprobar la cadena con la cadena invertida: 
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
	char frase1[100];
	char frase2[100];
	printf("Aqui puedes identificar frases palindromas\n\nEscribe tu frase: ");
	gets(frase1);
	int letra1 = 0;
	int letra2 = 0; 
	for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
	{
    	if (frase1[letra1] != ' ')
		{ 
        	     frase2[letra2++] = frase1[letra1];
		} 
	}
	strlwr(frase2);
	printf("%s", frase2);
	if (frase2 == strrev(frase2))
	{
		printf("\nTu frase es palindroma!");
	}
	else
	{
		printf("\nTu frase no es palindroma!");
	}
}
			
			
			
				Prueba a cambiar esto :
-Con esto comprobamos letra por letra en la frase2.
int inicio=0;
int fin=letra2-1;
	while((inicio<fin) && (frase2[letra1]==frase2[letra2])){
	    inicio++;
	    fin--;
	}
si el while sale porque fin e inicio son iguales es que es palindromo y tirara por el if, si no se cumple la igualdad de las letras tirara por el else y no será palindromo
if (frase2[inicio] == frase2[fin])
	{
		printf("\nTu frase es palindroma!");
	}else ......
			
			
			
				no puedes comprobarlo directamente porque los array de char son mas largos que las palabras que evaluas... 
yo haría algo como
inicio = 0;
fin = strlen(frase)
while(inicio<=fin){
  si(frase[inicio++] != frase[fin--]) { //no estoy seguro si se resta 1
    //no es palindromo... hacer lo que se vaya a hacer
    break;
  }
}
			
			
			
				Cita de: AxelP en 15 Noviembre 2014, 06:10 AM
Hola a todos, tengo que hacer un programa que identifique las frases palíndromas. Tengo este código, pero falla en el if al comprobar la cadena con la cadena invertida: 
En esencia la idea está bien pero mal implementada:
* Al usar "strrev(frase2)" de forma automática la frase 2 queda invertida y lógicamente es siempre igual a si misma.
* Lo anterior lleva al uso de una tercera cadena para guardar frase1 igual a frase2:
for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
  if (frase1[letra1] != ' ')
    frase2[letra2++] = frase1[letra1] , frase3[letra2 - 1] = frase1[letra1]; y a continuación no hay más que comparar frase3 con frase2 invertida.
* Pero ahí viene el otro error grave que tienes que es comparar en el if dos cadenas con "==" cuando eso en C no es válido. Para ello has de usar "strcmp":
if (strcmp (frase3 , strrev(frase2))  == 0)
  printf("\nTu frase es palindroma!");
 else
  printf("\nTu frase no es palindroma!");Con esas correcciones tu código es totalmente funcional.
Aunque las otras ideas que te han dado son más "chachis".
P.D:Te falta el "return" de main.
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
 
			 
			
			
				Les agradezco mucho a todos, ahora ya pude comprender mejor como lo hace  ;-)
Solo tengo una duda en la respuesta de leosansan, el código funciona, pero ¿Por qué le restas 1 en la parte de frase3[letra2 - 1]? Eso es lo único que no entiendo, y repito muchas gracias a todos. 
Cita de: leosansan en 15 Noviembre 2014, 20:33 PM
* Lo anterior lleva al uso de una tercera cadena para guardar frase1 igual a frase2:
for (letra1 = 0; letra1 <= strlen(frase1) ; letra1++)
  if (frase1[letra1] != ' ')
    frase2[letra2++] = frase1[letra1] , [u]frase3[letra2 - 1][/u] = frase1[letra1];
 
			 
			
			
				Cita de: AxelP en 15 Noviembre 2014, 23:33 PMSolo tengo una duda en la respuesta de leosansan, el código funciona, pero ¿Por qué le restas 1 en la parte de frase3[letra2 - 1]? Eso es lo único que no entiendo
Es debido al uso del operador secuencial ",". Su comportamiento dada la expresión:
frase2[letra2++] = frase1[letra1] , frase3[letra2 - 1] = frase1[letra1];Es el siguiente:
1) Se evalúa la expresión a la izquierda, esta es "frase2[letra2++] = frase1[letra1]" y su resultado se descarta.
2) Todos los efectos laterales del paso 1 se aplican: el valor de la variable "letra2" se incrementa en una unidad.
3) Se evalúa la expresión a la derecha, esta es "frase3[letra2 - 1] = frase1[letra1]". El punto importante aquí es que el valor de "letra2" ya se incremento en una unidad y ahora es el indice del siguiente carácter, por ello se le resta una unidad.
Ya que la idea es copiar la cadena en dos arrays otra opción mas sencilla y con el mismo efecto es:
frase3[letra2] = frase2[letra2] = frase1[letra1];
letra2++;Un saludo
			
 
			
			
				Muchas gracias  :D ;-)
Ahora entiendo por qué es, y que tu ejemplo es lo mismo, creo que ya comprendo perfectamente el código, muchas gracias rir3760 y también a todos los demás, ya pude entender y hacer mi tarea  :D
			
			
			
				Cita de: rir3760 en 16 Noviembre 2014, 02:31 AM
......................................
Ya que la idea es copiar la cadena en dos arrays otra opción mas sencilla y con el mismo efecto es:
frase3[letra2] = frase2[letra2] = frase1[letra1];
letra2++;
.........................
Incluso más sencillo:
frase3[letra2] = frase2[letra2++] = frase1[letra1];¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
 
			 
			
			
				Cita de: leosansan en 16 Noviembre 2014, 14:05 PMIncluso más sencillo:
frase3[letra2] = frase2[letra2++] = frase1[letra1];
No porque el operador de asignación no garantiza un punto de secuencia y por ende en la expresión:
frase3[letra2 /* B */] = frase2[letra2++ /* A */] = frase1[letra1];Se corre el riesgo de que la expresión A se evalue y su efecto lateral se aplique 
antes que la evaluación de la expresión B.
Un caso similar que se utiliza para explicar el punto y que por supuesto no se recomienda es:
a[i] = i++;Debido a que el resultado de la expresión depende del orden de evaluación de los operandos y el momento exacto de la aplicación de los efectos laterales (algo que no define el lenguaje).
Un saludo