Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Cracky7 en 12 Febrero 2012, 15:39 pm



Título: [Ayuda] Ejercicio simple
Publicado por: Cracky7 en 12 Febrero 2012, 15:39 pm
Mi enunciado es:
Citar
Crear una función que reciba una cadena y una letra, y devuelva la cantidad de veces
que dicha letra aparece en la cadena.

Y hasta ahora tengo:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int numeroVeces(char c, char cadena[80])
  5. {
  6.  int i=0, b=0;
  7.  
  8.  for (i=0; i<strlen(cadena); i++)
  9.    {
  10.      if (strcmp(c, cadena[i]) == 0)
  11.        b++;
  12.    }
  13.  
  14.  return b;
  15. }
  16.  
  17. int main()
  18. {
  19.  char a;
  20.  char linea[80];
  21.  
  22.  printf("Introduce la letra a buscar: ");
  23.  a = getchar();
  24.  getchar();
  25.  printf("Introduce la cadena donde buscarla: ");
  26.  gets(linea);
  27.  printf("%d", numeroVeces(a, linea));
  28.  
  29.  return 0;
  30. }
  31.  

Por más que lo intento, se cierra siempre después de introducir mi cadena, y el debugger dice que el problema está en la línea:
Código
  1.  printf("%d", numeroVeces(a, linea));


Título: Re: [Ayuda] Ejercicio simple
Publicado por: eleon en 12 Febrero 2012, 16:10 pm
Claro porque estás intentando pasar una cadena por valor. Las matrices/tablas/vectores/cadenas (son lo mismo) no pueden pasarse a una función directamente, es como si intentaras hacer esto:

Código
  1. tabla1 = tabla2;

No se puede asignar una tabla a otra sino que hay que hacerlo elemento a elemento. Para pasar una tabla a una función debes usar paso por referencia.

Saludos.


Título: Re: [Ayuda] Ejercicio simple
Publicado por: durasno en 12 Febrero 2012, 16:54 pm
Hola! todos las cadenas pasan por referencia ya que el el nombre de una cadena es un puntero al inicio del arreglo.

El error esta en strcmp. Esta funcion recibe dos punteros a char (char *) y vos le estas pasando como primer argumento un char. Para contar las veces que aparece la letra solo basta con poner
if (c==cadena))
        b++;


Título: Re: [Ayuda] Ejercicio simple
Publicado por: Cracky7 en 12 Febrero 2012, 20:27 pm
Vaya, hombre.
Eso lo tenía puesto antes, lo cambié por strcmp y, como seguía sin funcionar, no lo volví a poner. Algo debo de haber cambiado y no me acuerdo qué.

De todas maneras ya funciona. ¡Gracias, durasno!


Título: Re: [Ayuda] Ejercicio simple
Publicado por: Anastacio en 15 Febrero 2012, 20:09 pm
A que te refieres con elemento por elemento???


Título: Re: [Ayuda] Ejercicio simple
Publicado por: armizh en 15 Febrero 2012, 20:29 pm
No debiese ser:
Código
  1. if (c==cadena[i]))
  2.        b++;
??
Ademas es redundante hacer esto:
Código
  1. //le das valor a i
  2. int i=0
y luego
Código
  1. //le vuelves a dar valor a i ????
  2. for (i=0; i<strlen(cadena); i++)
Tal vez esto podria resultar...
Código
  1. int numeroVeces(char c, char cadena[80])
  2. {
  3.  int i, b=0;
  4.  
  5.  for (i=0; i<strlen(cadena); i++)
  6.    {
  7.      if (c==cadena[i]) //tambien puede ser if (strcmp((char *)c, cadena[i]) == 0)
  8.        b++;
  9.    }
  10.  
  11.  return b;
  12. }

Saludos


Título: Re: [Ayuda] Ejercicio simple
Publicado por: rir3760 en 16 Febrero 2012, 01:17 am
Dos detalles a considerar ...

El primero es solo para reducción del código fuente. Ya que se deben verificar cada uno de los caracteres de la cadena no es necesario el uso de la función "strlen", basta con verificar si el carácter es el indicador del final de la cadena (el '\0'):
Código
  1. int i, b = 0;
  2.  
  3. for (i = 0; cadena[i] != '\0'; i++)
  4.   if (cadena[i] == c)
  5.      b++;

El segundo es un error en el comentario:
Código
  1. if (c==cadena[i]) //tambien puede ser if (strcmp((char *)c, cadena[i]) == 0)
Eso no funcionara ya que el valor almacenado en la variable "c" se tomaría como una dirección en memoria, tampoco vale como segundo argumento "cadena[ i ]" ya que es un carácter.

Un saludo