elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] ayuda, programa compila bien pero no cumple la funcion (solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] ayuda, programa compila bien pero no cumple la funcion (solucionado)  (Leído 3,770 veces)
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
[C] ayuda, programa compila bien pero no cumple la funcion (solucionado)
« 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!


« Última modificación: 16 Abril 2012, 00:34 am por xiruko » En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: [C] ayuda, programa compila bien pero no cumple la funcion
« Respuesta #1 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


En línea

Ahorrate una pregunta, lee el man
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [C] ayuda, programa compila bien pero no cumple la funcion
« Respuesta #2 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.
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: [C] ayuda, programa compila bien pero no cumple la funcion
« Respuesta #3 en: 15 Abril 2012, 23:13 pm »

mmm estas seguro? Te funciona bien sumandole 1??

Saludos
En línea

Ahorrate una pregunta, lee el man
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [C] ayuda, programa compila bien pero no cumple la funcion
« Respuesta #4 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...
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: [C] ayuda, programa compila bien pero no cumple la funcion
« Respuesta #5 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)
En línea

Ahorrate una pregunta, lee el man
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [C] ayuda, programa compila bien pero no cumple la funcion
« Respuesta #6 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".
« Última modificación: 16 Abril 2012, 00:17 am por xiruko » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Compila bien, pero no ejecuta !! Solucionado
Java
Vingilot 4 4,149 Último mensaje 8 Enero 2008, 15:20 pm
por Vingilot
Programa que compila, pero error en consola
Java
AndenBomber 1 2,770 Último mensaje 29 Mayo 2008, 19:49 pm
por HadesDark
Calcular mcd. Compila bien pero no corre « 1 2 3 »
Programación C/C++
jairogon 24 16,889 Último mensaje 3 Julio 2010, 03:09 am
por nicolas_cof
compila y ejecuta bien, pero me muestra un caracter raro
Programación C/C++
pedroarcego 7 4,230 Último mensaje 7 Septiembre 2010, 11:28 am
por Garfield07
funcion md5 no funciona bien en linux (pero si en windows)
Programación C/C++
envai 1 3,830 Último mensaje 26 Febrero 2011, 23:27 pm
por Leber
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines