Problemita con un programa en C ¿Una ayudita?

El ejercicio dice lo siguiente:
Una prueba de un programa de television consiste en obtener el palindromo mas largo posible.
Un palindromo es una frase que se lee igual en ambos sentidos.
Para facilitar el proceso los jeuces quiere un programa que les diga si la frase es un palindromo.

Por ejemplo: "dabale arroz a la zorra el abad".

El palindromo puede contener espacios en blanco que no deben considerarse.
Haced con punteros y funciones.


Vale pues yo lo he hecho en casita ahora y me compila pero cuando llega a los strcmp CASCA.
Ademas creo que el compilador no debe estar muy bien porque me ha tocado usar "gets(palabra);" cuando en clase bajo el mismo compilador uso siempre "scanf("%s",&palabra);" y aqui en casa ahora no va...


Mi codigo:
#include <stdio.h>
#include <stdlib.h>


main()
{
char palabra[50];
leer(palabra);
juntar(palabra);
comprobar(palabra);
getch();

}


leer(char *palabra)
{
gets(palabra); // QUERIA USAR "scanf("%s",&palabra);", PERO NO ME LO TRAGA Y ESO QUE EN EL COMPILADOR DE CLASE SIEMPRE PERO AQUI NO...
}


juntar(char *palabra)
{
int i=0,j=0,max=0;
max=strlen(palabra);
char palabra2[50];


for (i=0;i<max;i++) // QUITAMOS ESPACIOS Y LO GUARDAMOS EN PALABRA2
{
if( strcmp(palabra[i],' ')!=0 )
{
palabra2[j]=palabra[i];
j++;
}
}

for (i=0;i<max;i++) // COPIAMOS PALABRA2 en PALABRA
{
palabra[i]=palabra2[i];
}
}


comprobar(char *palabra)
{
int i=0,max=0,contador=0;
max=strlen(palabra);

for (i=0;i<max/2;i++)
{
if( strcmp(palabra[i],palabra[max-i])!=0 )
{contador=1;}
}

if (contador==0)
{
printf("SI ES UN PALINDROMO\n");
}
else
{
printf("NO ES UN PALINDROMO\n");
}
}


Nota: EL quote se ha cargado los espacios que hace que sea leible mas facimente...
NOTA2: Lo he puesto en varios quotes para que sea mas facil leerse...

Adjuntos

codigo.txt (1.05 KB)

Os subo el Codigo en un TXT mas ordenadito ;D
No lo he probado pero creo que va a ser porque te has comido la librería "string.h"
madeinsusa escribió:No lo he probado pero creo que va a ser porque te has comido la librería "string.h"


En clase nunca linkamos esa libreria y va el strcmp y srtlen.
De todas maneras te digo que lo acabo de probar linkandola y vuelve a fallar.
Y se que el problema esta en el "strcmp"
Mmmhhh... voy a echarle un ojo a ver qué puede ser
tb he subido el codigo en un TXT ahi se ve un poco mejor ;D

aver si podeis hecharme un cable ya que yo creo que el strcmp esta bien usado O.OU pero esto me dice que nanai...
En pascal te lo se hacer pero C aún no he tocado xD
kodeone escribió:En pascal te lo se hacer pero C aún no he tocado xD

Juas... Yo Pascal no lo he tocado xD
Solo Python y C (Y pronto Java).

Aunque en mi clase varias personas estan asqueadas quejandose diciendo que "C" es un mierda... Me parece que soy el unico que aprecia y adora C [fumando] [fumando]
Porque java, c++ etc... si seran mejores en X aspectos y mas simples para hacer alomejor un programa con interfaz grafica y todo eso pero como que con esos lenguajes no programas un PIC, un ARM o cualquier otro micro ;D

Con lo cual para mi C es la madre de los lenguajes casi todo puede hacerse en C asi que yo lo adoro XD

Volviendo al tema alguien se da cuenta de mi estupido fallo?? XD
que mania todo el mundo usando el for, el while es más potente ! xD

Este ejercicio lo he hecho hace poco en clase, estudio "ASI",no te sabría decir lo que falla de tu programa por que hay cosas que no entiendo,ya que depende que compilador uses cambian algunas cosas y ahora mismo no tengo le programa para compilarlo.
te dejo mi ejercicio para que le heches un ojo y compares.
lo he probado en clase con el Dev-CppPortable y funciona perfectamente,no tiene demasiada complicación.

/*EJ-->85.- Palíndrom. Un palíndrom és una paraula o una expressió
que es llegeix igual de dreta a esquerra que d'esquerra a dreta.
   Llegir del teclat una paraula o una expressió  i verificar sí és un palíndrom. */
#include <stdio.h>
#include <stdlib.h>
#define MAX 50

int main(int argc, char *argv[])
{
  char N[MAX];
  int cont;
  int cont2;
  char C[MAX];
  int suma=0;
  int lon;
  int cont3=0;
 
  cont=0;
  printf("Escriu una cadena de caracters: ");
  gets(N);
  lon=strlen(N);
  cont2=lon-1;
  while(cont<MAX){
                  C[cont]=N[cont2];
                  cont=cont+1;
                  cont2=cont2-1;}
                 
  C[lon]='\0';
                  cont=0;
                 
  /*while(cont<lon){
                  printf("%c",C[cont]);
                  cont=cont+1;}
  printf("\n");
  puts(N);*/
  /////////treu els espais del vector N

  cont=0;
  while(cont<lon){
                  cont2=cont;cont3=0;
                  if(N[cont]==' '){
                                while(cont2<lon){
                                        N[cont+cont3]=N[cont+cont3+1];
                                        cont2=cont2+1;
                                        cont3=cont3+1;
                                        }}
  cont=cont+1;}
 
 
  ////////
  ///////treu els espais en blanc del vector C

  cont=0;
  while(cont<lon){
                  cont2=cont;cont3=0;
                  if(C[cont]==' '){
                                while(cont2<lon){
                                        C[cont+cont3]=C[cont+cont3+1];
                                        cont2=cont2+1;
                                        cont3=cont3+1;
                                        }}
  cont=cont+1;}
 
 
  ////////
 
 
  cont=0;
  while(cont<lon){
                  if(N[cont]!=C[cont]){
                                       suma=suma+1;}
                  cont=cont+1;}
  printf("\n");
  if(suma!=0){printf("No es palindromo\n");}
  else{printf("Es palindromo\n");}
 
  system("PAUSE");   
  return 0;
}

Adjuntos

-Crono- escribió:que mania todo el mundo usando el for, el while es más potente ! xD


¿Por? Hasta donde yo sé, en bajo nivel son lo mismo, sólo que con el for el propio compilador se encarga del contador en vez de tenerlo que poner tú a mano.

Un saludo
No estás usando bien strcmp, si lo que quieres es comparar solo caracteres de dos cadenas no hace falta usarlo, es más, está mal hacerlo.
Esa función se usa para comparar cadenas enteras, ese es el fallo.

EDITO: con respecto al lenguaje C, es la base de todos los demás lenguajes, y si sabes usarlo bien, con nada que te mires algo de otro lenguaje distinto te es mucho más fácil aprenderlo.
vale chicos ya lo he solucionado ;D
Me di cuenta a leer un poco el ejer del compi de arriva que lo publico que para mi gusto con perdon no me termina de gustar por el nombre de variables y todo el codigo metido en el main...
Aunque eso va a gustos segun programador ;D

Lo de los for... yo tb prefiero while y do while pero la profesora se empeña en que usemos for... y como mañana es el examen para hacer cuentas usare for ;D
Por cierto no useis gets para capturar caracteres ni puts usar scanf y printf...

Bueno lo del printf envez de puts es mania tonta pero lo del scanf no es cosa mia solo esta demostrado que es mucho mejor y menos explotable el uso del scanf("%s",&VARIABLE); que el gets(VARIABLE); o VARIABLE=gets();

Por otra parte decir que mi error era una idiotez como una casa... estaba usando strcmp (string compare) para comprarar caracter por caracter @_@ se me fue un poco la olla xD
Ya que yo no estoy comparando un string con otro string sino un char con otro char.
SE ME FUE LA OLLA XD

Ejer resuelto:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


main()
{
char palabra[50];
leer(palabra);
juntar(palabra);
comprobar(palabra);
getch();

}

leer(char *palabra)
{
gets(palabra);
}

juntar(char *palabra)
{
int i=0,j=0,max=0;
max=strlen(palabra);
char palabra2[50];


for (i=0;i<max;i++) // QUITAMOS ESPACIOS Y LO GUARDAMOS EN PALABRA2
{
if( palabra[i]!=' ' )
{
palabra2[j]=palabra[i];
j++;
}
}

for (i=0;i<max;i++) // COPIAMOS PALABRA2 en PALABRA
{
palabra[i]=palabra2[i];
}
}

comprobar(char *palabra)
{
int i=0,max=0,contador=0;
max=strlen(palabra);

for (i=0;i<max/2;i++)
{
if(palabra[i]!=palabra[max-1-i])
{contador=1;}
}

if (contador==0)
{
printf("SI ES UN PALINDROMO\n");
}
else
{
printf("NO ES UN PALINDROMO\n");
}
}


Como veis los cambios entan en los if que comparaba con strcmp ahora lo hago tal cual con "variable1[cont1]=!variable2[cont2]".

madeinsusa escribió:No estás usando bien strcmp, si lo que quieres es comparar solo caracteres de dos cadenas no hace falta usarlo, es más, está mal hacerlo.
Esa función se usa para comparar cadenas enteras, ese es el fallo.

Joder macho te me has adelantado eso me pasa por escribir un post tan largo jajaja...
Cle@r escribió:
-Crono- escribió:que mania todo el mundo usando el for, el while es más potente ! xD


¿Por? Hasta donde yo sé, en bajo nivel son lo mismo, sólo que con el for el propio compilador se encarga del contador en vez de tenerlo que poner tú a mano.

Un saludo

Es una coña que tengo en mi clase con el for y el while :p
El for es más estructurado por lo que has dicho, en la misma sentencia declaras la condición de seguimiento y el incremento sin embargo la llamada dle while es bastante más rapida que la de cualquier otro ciclo,por eso acostumbro a usar el while por que la aplicación queda más depurada,esta bien utilizar el for cuando sabes que tiene que repetir un bucle una cantidad de veces predefinida,pero si no sabes cuantas veces son ahi tienes el while,solo necesitas una condición.

pero en este caso tienes razón da lo mismo cual utilices, es una rayada mia que tengo con el for y el while :)
Bueno lo importante al fin y al cabo es darte cuenta del fallo porque a veces terminas dándote de cabezazos...

Ah, y no soy macho :P
madeinsusa escribió:Bueno lo importante al fin y al cabo es darte cuenta del fallo porque a veces terminas dándote de cabezazos...

Ah, y no soy macho :P

MACHO!! tienes razon [qmparto] [qmparto] [qmparto]
nah era broma lo de macho es una forma de hablar (demasiado coloquial tal vez xD)

De todas maneras gracias a todos...
Si no llego a ver otro ejercicio y ver que comparaba tal cual me habria tirado una hora mas dandome cabezazos diciendo ¿XK ESTA MAL? XDD
Esque no se porque mania se me metio en la cabeza que era un strcmp ^^u

aunque si despues de quitar los espacio hubiese copiado la palabra en otro vector (palabra2) al reves si podria haber usado strcmp para comparar el string palabra y el string palabra2.

Pero no me lo plantee inicialmente asi [tomaaa] [tomaaa] [tomaaa]

PD: Que conste que de momento eres la unica "mujer" que me ha correjido algun fallo en programacion xD, ya que en mi clase y mi circulo de amigos son todo tios, y bueno la profesora de programacion que tengo se queja por tondo tipo de tonterias asi que no acepto sus mejoras que mas que mejoras son "HAZLO COMO YO QUIERO", el tuyo va pues bien pero "COPIATE EL MIO" ¬¬u
Con solo decirte que me ha quejacon tonterias como poner unos corchetes {} en algun if/for etc... cuando no son extrictamente necesarios (1 sola operacion) yo los pongo porque me aclaro mas visualmente y me gusta mas pero a ella no y si se los pones te hacer un OWNED y te lo marca como mal ...
Yo aprendí a programar en ensamblador (fíjate tú qué cosas, en un lenguaje bastante chungo), y ahora la programación a nivel más alto se me da bastante bien gracias al hecho de haber aprendido con el difícil...
Nota del moderador: Mejor en PC - General
kurras escribió:Nota del moderador: Mejor en PC - General


No hacia falta que lo movieras lo iva a cerrar ya debido a que la respuesta ya esta respondida y suplida ;D

Procedo a chapar.

Edit: ups... no puedo cerrarlo no es compra-venta jajaja...
Para la próxima, para poner código se usa la etiqueta Code, no Quote.
amuchamu escribió:Para la próxima, para poner código se usa la etiqueta Code, no Quote.


Gracias por decirmelo... esque nunca he usado el code en eol.
Siemple he usado quote para citar y tal...

Para la proxima ya lo se ;D
Una pequeña duda... ¿ha nadie le ha eextrañado el uso de gets()¿? El propio compilador te dice que es desaconsejable su uso (gcc), pues no reserva la memoria. En su lugar usa fgets... uso:

fgets(char *palabra, int numerodecaracteres, stdin)
Pues el gets es desaconsejable si señor ;D
fgets es la primera ver que lo oigo [+risas] [+risas]

pudiendo usar un scanf para todo (numero , caracteres y strings) para que calentarse la cabeza ??
Precisamente me parece que el gets es una función de una libreria que sólo está en Windows, yo que manejo Linux, hasta que no aprendí a usar bien el scanf me las veía y me las deseaba para capturar strings...
scanf casca cada vez que encuentra un espacio, \n y demas... Sinceramente me parece bastante mejor fgets. Se puede usar para todo, de hecho hasta para guardar enteros. Supongamos que queremos almacenar tan solo la primera palabra... pues:

fgets(char *cadena, MAX, stdin /*Para leer del teclado, se pudiera sustituir por cualquier puntero a fichero*/);

sscanf(cadena, "%s ", char *palabra);

Con un int, float... se podria modificar el %s por su respectivo d, f o lo que se les pueda ocurrir. Se me ocurre que esta es una buena opcion para el control de errores. ¿Cómo hacen para comprobar que el usuario solo introduce un numero y no se confunde y pone una letra a continuacion o mil perrerias que pudieran pasar? Esta manera es bastante sencilla...

¿Que con scanf se podria hacer tambien? Si, sin lugar a dudas...

PD: gets tambien esta disponible en gcc ;)
22 respuestas