[Ayuda] Ejercicio simple

Iniciado por Cracky7, 12 Febrero 2012, 15:39 PM

0 Miembros y 1 Visitante están viendo este tema.

Cracky7

Mi enunciado es:
CitarCrear 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:

#include <stdio.h>
#include <string.h>

int numeroVeces(char c, char cadena[80])
{
  int i=0, b=0;

  for (i=0; i<strlen(cadena); i++)
    {
      if (strcmp(c, cadena[i]) == 0)
        b++;
    }

  return b;
}

int main()
{
  char a;
  char linea[80];

  printf("Introduce la letra a buscar: ");
  a = getchar();
  getchar();
  printf("Introduce la cadena donde buscarla: ");
  gets(linea);
  printf("%d", numeroVeces(a, linea));

  return 0;
}


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:
  printf("%d", numeroVeces(a, linea));

eleon

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:

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.

durasno

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++;
Ahorrate una pregunta, lee el man

Cracky7

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!

Anastacio

A que te refieres con elemento por elemento???
You, stop to close my post, you were novice too!!!!!!!!!!!!

armizh

No debiese ser:
if (c==cadena[i]))
        b++;

??
Ademas es redundante hacer esto:
//le das valor a i
int i=0

y luego
//le vuelves a dar valor a i ????
for (i=0; i<strlen(cadena); i++)

Tal vez esto podria resultar...
int numeroVeces(char c, char cadena[80])
{
  int i, b=0;

  for (i=0; i<strlen(cadena); i++)
    {
      if (c==cadena[i]) //tambien puede ser if (strcmp((char *)c, cadena[i]) == 0)
        b++;
    }

  return b;
}


Saludos
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

rir3760

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'):
int i, b = 0;

for (i = 0; cadena[i] != '\0'; i++)
   if (cadena[i] == c)
      b++;


El segundo es un error en el comentario:
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language