Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: xiruko en 15 Abril 2012, 21:21 pm



Título: [C] ayuda, programa compila bien pero no cumple la funcion (solucionado)
Publicado por: xiruko en 15 Abril 2012, 21:21 pm
buenas gente, estoy tratando de hacer un programa que le pases una palabra y una frase, y te diga cuantas veces esta la palabra en la frase. estoy tratando de hacerlo con punteros y funciones para ir practicando, asi que seguro que no es la manera mas eficiente de hacerlo. pero bueno, el codigo es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define WORD 10
  5. #define SENTENCE 50
  6.  
  7. int longitud_cadena (char* a);
  8. void comparar_cadenas (char* s, int i, char* w, int lw, int* words);
  9.  
  10. int main() {
  11.  
  12.  char *w,*s;
  13.  int i,long_w,long_s,words;
  14.  
  15.  w=(char*) calloc(WORD,sizeof(char));
  16.  s=(char*) calloc(SENTENCE,sizeof(char));
  17.  
  18.  words=0;
  19.  
  20.  printf("Introduce una palabra de maximo %d caracteres:\n",WORD-2);
  21.  fgets(w,WORD,stdin);
  22.  long_w=longitud_cadena(w);
  23.  
  24.  printf("Introduce una frase de maximo %d caracteres:\n",SENTENCE-2);
  25.  fgets(s,SENTENCE,stdin);
  26.  long_s=longitud_cadena(s);
  27.  
  28.  for(i=0;i<long_s;i++) {
  29.    if(*(s+i)==*w) { comparar_cadenas(s,i,w,long_w,&words); }
  30.  }
  31.  
  32.  printf("La palabra ocurrio %d veces.\n",words);
  33.  return 0;
  34. }
  35.  
  36. int longitud_cadena (char* a) {
  37.  
  38.  int num_ch,i;
  39.  num_ch=0;
  40.  for(i=0;(int)*(a+i)!=10;i++) { num_ch++; }
  41.  return(num_ch);
  42. }
  43.  
  44. void comparar_cadenas (char* s, int i, char* w, int lw, int* words) {
  45.  
  46.  int n;
  47.  
  48.  for(n=0;n<lw;n++) {
  49.    if(*(s+i+n)!=*(w+n)) { break; }
  50.  }
  51.  if(n==lw) { (*words)++; }
  52. }

el tema es que compila bien, pero siempre me dice que la palabra ocurrio 0 veces en la oracion. llevo 2 horas repasandolo y siguiendo el flujo del programa con papel y boli y es que no doy con el fallo.

alguien me echa un cable? la verdad se agradeceria... no quiero irme a dormir sin verlo funcionando xD

gracias!

EDITADO: añadido algunas correcciones y ahora casi funciona, la salida marca 1 si la palabra aparece una o mas veces, y marca 0 si la palabra no se encuentra en la frase.

EDITADO2: ya funciona correctamente. por si a alguien le interesa, el error estaba en la funcion longitud_cadena que devolvia 1 caracter mas de la cuenta.

gracias por la ayuda!


Título: Re: [C] ayuda, programa compila bien pero no cumple la funcion
Publicado por: durasno en 15 Abril 2012, 22:43 pm
Hola! el error esta en usar scanf para ingresar una frase. Si vos qres ingresar algo como "Hola soy una frase", scanf lee hasta encontrar un blanco, osea solo se va a guardar en s: "Hola". Para ingresar frases podes usar: gets, fgets o crear tu propia funcion para entrada de cadenas
Otro error es: if(n+1==lw). Si las palabras son iguales, n ya va a ser igual a lw, no es necesario sumarle 1

Saludos


Título: Re: [C] ayuda, programa compila bien pero no cumple la funcion
Publicado por: xiruko en 15 Abril 2012, 22:57 pm
muchas gracias por contestar, justo ahora estaba buscando en google acerca de la funcion scanf y los espacios...

respecto a lo de if(n+1==lw), n corresponde al indice de la cadena y empiezo por n=0, y lw son los caracteres que tiene la palabra a buscar. asi que si una palabra tiene 4 caracteres, significa que su indice va de 0 a 3, por eso ahi hago n+1, ya que si en el for no se ha encontrado ninguna diferencia de caracteres, n valdra 3 y lw 4.


Título: Re: [C] ayuda, programa compila bien pero no cumple la funcion
Publicado por: durasno en 15 Abril 2012, 23:13 pm
mmm estas seguro? Te funciona bien sumandole 1??

Saludos


Título: Re: [C] ayuda, programa compila bien pero no cumple la funcion
Publicado por: xiruko en 15 Abril 2012, 23:21 pm
pues no se si funciona bien ya que aun no he conseguido que funcione... xD

he probado con la funcion gets(), he buscado en google y dice que esta en la libreria stdio.h, pero cuando ejecuto el programa es como si no hubiera ninguna funcion gets() y no me deja introducir la frase.

sabes por que pasa esto?

diria que es n+1 ya que me he hecho un par de ejemplos con papel y boli y se cumplia para n+1, aunque quizas tengas razon y sea solo n. a ver cuando pueda hacerlo funcionar...


Título: Re: [C] ayuda, programa compila bien pero no cumple la funcion
Publicado por: durasno en 15 Abril 2012, 23:30 pm
El problema es al usar scanf primero, despues de ingresar una palabra se tipea el ENTER el cual queda almacenado en el bufer de entrada y gets toma ese ENTER sin dejarte ingresar la frase
Para que no tome el enter podes hacer
scanf("%s",w);getchar();

o usar dos gets
gets(s)
gets(w)


Título: Re: [C] ayuda, programa compila bien pero no cumple la funcion
Publicado por: xiruko en 15 Abril 2012, 23:48 pm
muchas gracias de nuevo! he mirado lo del n+1 y tenias razon, no hay que sumarle nada ya que n valdra lw si ha hecho todo el ciclo correctamente.

he probado poniendo dos fgets() (para limitarle a que guarde solo un nº de caracteres entrados por stdin) y ahora al menos reacciona y marca que ocurrio 1 vez, aunque sean 10 xD

edito el primer post para incluir las modificaciones, y mañana sigo revisando porque no funciona ya que me tengo q ir en nada.

gracias por todo!

EDITO: he conseguido que funcione, el error estaba en la funcion longitud_cadena la cual devolvia 1 caracter mas de la cuenta.

me habia parecido leer que la funcion gets() eliminaba el caracter de salto de linea, pero he hecho una prueba rapida pasando a (int) los caracteres y en la cadena los dos ultimos digitos eran "10 0", que seria un salto de linea y un nulo respectivamente. asi que en la funcion longitud_cadena tan solo habia que cambiar el if, que en vez de compararlo con "0" se tenia que hacer con "10".