Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Contar caracteres 'e' en una frase

Estas en el tema de Contar caracteres 'e' en una frase en el foro de C/C++ en Foros del Web. Buenos dias. Estoy tratando de crear un programa en c, en el cual introduzco una frase y me cuenta, gracias a la funcion "cuenta", el ...
  #1 (permalink)  
Antiguo 26/08/2016, 04:11
 
Fecha de Ingreso: febrero-2014
Mensajes: 60
Antigüedad: 10 años, 8 meses
Puntos: 0
Contar caracteres 'e' en una frase

Buenos dias. Estoy tratando de crear un programa en c, en el cual introduzco una frase y me cuenta, gracias a la funcion "cuenta", el numero de caracteres 'e' que tiene la frase.

Resulta que cuando pongo por teclado "elena", me cuenta correctamente los caracteres 'e', pero cuando pongo "elena es hermosa", solo me cuenta los dos caracteres '2' de "elena", a partir de los espacios en blanco, no cuenta mas.

¿Que puede estar ocurriendo? ¿Como hago que cuente todos?

Os paso el codigo. Gracias


Código C:
Ver original
  1. //Bibliotecas
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. //Modulos
  7. int cuenta(char * cad, char c);
  8.  
  9. //Funcion principal
  10. int main(){
  11.    
  12.     // Declaramos strings  
  13.    
  14.     char c1[50];
  15.                
  16.                
  17.     // Voy a insertar una frase
  18.    
  19.     printf ("Introduzca una frase\n");
  20.     scanf("%s",c1);
  21.     printf ("\nIntrodujistes %s\n",c1);
  22.    
  23.     //Me muestra cuants caracteres 'e' tiene la frase que introducí
  24.     printf ("\nTiene %d caracteres 'e'\n", cuenta(c1, 'e'));
  25.    
  26.    
  27.    
  28. }
  29.  
  30.  
  31.  
  32. int cuenta(char * cad, char c){
  33.  
  34.    
  35.     int cont = 0;
  36.     int i = 0;
  37.    
  38.    
  39.    
  40.     //Mientras el caracter sea distinto de \0 ..
  41.    
  42.    while(cad[i] != '\0'){
  43.        
  44.        
  45.         //Si el caracter de la posicion actual del string es 'e'
  46.         if(cad[i] == 'e){
  47.            
  48.             //Aumentamos el contador
  49.             cont++;
  50.         }
  51.        
  52.         //incremento i
  53.         i++;
  54.        
  55.   }
  56.  
  57.   return cont;
  58.  
  59.        
  60. }
  #2 (permalink)  
Antiguo 26/08/2016, 04:35
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Contar caracteres 'e' en una frase

Para que scanf no se detenga al encontrar un espacio puedes indicarle que lo haga al final de la línea. Además puedes indicarle el número máximo de caracteres a leer, para evitar que lea más allá del tamaño del array y ocasione problemas.

Código C:
Ver original
  1. scanf("%50[^\n]s",c1);

Saludos!
__________________
Mi calculadora en Qt
  #3 (permalink)  
Antiguo 26/08/2016, 04:37
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Contar caracteres 'e' en una frase

Código C:
Ver original
  1. int main()
  2. {
  3.   char buffer[100];
  4.  
  5.   printf("Introduce una frase\n");
  6.   scanf("%s",buffer);
  7.   printf("%s\n",buffer);
  8. }

Si ejecutas el ejemplo y metes una frase con espacios verás que la respuesta que te devuelve el programa únicamente incluye la primera palabra... que es justo como se espera que funcione scanf.

Hay alternativas como juguetear un poco con el scanf para que sea capaz de leer toda la línea:

Código C:
Ver original
  1. scanf("%[^\n]",buffer);

Pero no es una opción segura porque no puedes controlar lo que introduce el usuario. Si tu buffer es de 10 caracteres y el usuario introduce una línea de 20 caracteres estarás pisando 11 bytes de memoria.

Siempre podrías limitar la lectura... pero la sintaxis de scanf no hace más que complicarse:

Código C:
Ver original
  1. scanf("%10[^\n]",buffer);

Una opción muy sencilla es leer caracter a caracter la entrada del teclado:

Código C:
Ver original
  1. int total=0;
  2. while( 1 )
  3. {
  4.   char c = getchar();
  5.   if( feof(stdin) ) break;
  6.   total += ( c == 'e' );
  7. }

Si no te gusta el código o te parece complejo de leer te facilito una opción más básica:

Código C:
Ver original
  1. int total=0;
  2. while( 1 )
  3. {
  4.   char c = getchar();
  5.  
  6.   if( feof(stdin) )
  7.     break;
  8.  
  9.   if( c == 'e' )
  10.     total++;
  11. }

Al salir del bucle tendrás en total el número de caracteres buscado.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #4 (permalink)  
Antiguo 26/08/2016, 04:50
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Contar caracteres 'e' en una frase

Esta forma:

Código C++:
Ver original
  1. total += ( c == 'e' );
como alternativa a esta:
Código C++:
Ver original
  1. if( c == 'e' )
  2.     total++;

no la conocía
__________________
Mi calculadora en Qt
  #5 (permalink)  
Antiguo 26/08/2016, 04:52
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Contar caracteres 'e' en una frase

Cita:
Iniciado por dehm Ver Mensaje
Esta forma:

Código C++:
Ver original
  1. total += ( c == 'e' );
como alternativa a esta:
Código C++:
Ver original
  1. if( c == 'e' )
  2.     total++;

no la conocía
En C las comparaciones generan un 1 si son ciertas y 0 si son falsas :)
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #6 (permalink)  
Antiguo 26/08/2016, 04:55
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Contar caracteres 'e' en una frase

Cita:
Iniciado por eferion Ver Mensaje
En C las comparaciones generan un 1 si son ciertas y 0 si son falsas :)
Ahhh...ahora entiendo la lógica
__________________
Mi calculadora en Qt
  #7 (permalink)  
Antiguo 26/08/2016, 06:16
 
Fecha de Ingreso: febrero-2014
Mensajes: 60
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Contar caracteres 'e' en una frase

Muchas gracias, ya entendi. Lo que no me quedo claro es una cosa de scanf

scanf("%10[^\n]",buffer);

Desconozco la sintaxis de scanf, pero intuyo que, [^\n] significa que ignore los saltos de linea?
  #8 (permalink)  
Antiguo 26/08/2016, 07:45
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 15 años, 2 meses
Puntos: 12
Respuesta: Contar caracteres 'e' en una frase

Hola

Cita:
Iniciado por dehm Ver Mensaje
Esta forma:

Código C++:
Ver original
  1. total += ( c == 'e' );
como alternativa a esta:
Código C++:
Ver original
  1. if( c == 'e' )
  2.     total++;

no la conocía
No eres el único, nunca se me había ocurrido hacerlo así :)

Un saludo
  #9 (permalink)  
Antiguo 29/08/2016, 00:47
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Contar caracteres 'e' en una frase

Cita:
Iniciado por p3cn0G Ver Mensaje
Muchas gracias, ya entendi. Lo que no me quedo claro es una cosa de scanf

scanf("%10[^\n]",buffer);

Desconozco la sintaxis de scanf, pero intuyo que, [^\n] significa que ignore los saltos de linea?
Esa cadena le dice a scanf que lea un máximo de 10 caracteres o hasta que se encuentre un salto de línea, lo que llegue antes.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: caracteres, frase, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:17.