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

Novato intenta sin exito hacer un ejercicio de un curso de C

Estas en el tema de Novato intenta sin exito hacer un ejercicio de un curso de C en el foro de C/C++ en Foros del Web. Hola amigos! Soy nuevo por aqui, pero espero que me recibais con agrado, porque vengo a preguntar Llevo muy poquito aprendiendo el lenguaje C y ...
  #1 (permalink)  
Antiguo 10/07/2008, 10:51
 
Fecha de Ingreso: julio-2008
Mensajes: 2
Antigüedad: 15 años, 9 meses
Puntos: 0
Pregunta Novato intenta sin exito hacer un ejercicio de un curso de C

Hola amigos! Soy nuevo por aqui, pero espero que me recibais con agrado, porque vengo a preguntar Llevo muy poquito aprendiendo el lenguaje C y me esta costando un poco pero con paciencia y animo lo conseguire... pero en este punto, aunque el animo sigue en pie, la paciencia se ha desplomado.
A ver, es que tengo un curso que me he bajado por ahi que va poniendo ejercicios, y uno de ellos consiste en hacer lo siguiente: un programa que almacene datos de hasta 50 personas (tales como nombre, direccion, edad...) y que al pulsar Intro sin escribir nada cuando te pide el nombre aparezca un menu con las siguientes opciones: 1-mostrar todos los nombres; 2-mostrar los nombres de las personas con una cierta edad; 3-mostrar los nombres de las personas cuya inicial sea la que se indique en el programa; 4- salir del programa.
Bueno, de esto se trata el ejercicio, y yo lo hago todo bien (me imagino que seguro que se puede mejorar) menos la opcion 3, la de la inicial, no se como comparar la inicial que mete el usuario del programa con al primera letra de cada nombre!!! He hecho lo siguiente, pero me da un error (el case 3: es donde tengo el problema):

Código PHP:
#include <stdio.h>
#include <string.h>
struct {
       
char nombre[60], direccion[100];
       
int tlfno;
       
int edad;
       }
usuario[50];
char temp[11], letra;
int iopcionjedad;
main()
{
      for (
i=0i<50i++)
          {
          
printf("Escriba su nombre completo: ");
          
          
gets(usuario[i].nombre);
          if (
strcmp (usuario[i].nombre"")==0) break;
          
printf("\nEscriba su direccion: ");
          
gets(usuario[i].direccion);
          
printf("\nEscriba su telefono: ");
          
gets(temp);
          
sscanf(temp"%d", &usuario[i].tlfno);
          
printf("\nEscriba su edad: ");
          
gets(temp);
          
sscanf(temp"%d", &usuario[i].edad);
          }
      do
          {
          
printf("\n\n\nEscoja una opcion:\n");
          
printf("1.-Mostrar la lista de todos los nombres.\n");
          
printf("2.-Mostrar las personas de la edad que se indique.\n");
          
printf("3.-Mostrar las personas cuyo nombre empiece con la letra que se indique.\n");
          
printf("4.-Salir del programa\n");
          
scanf("%d", &opcion);
          switch (
opcion)
                 {
                 case 
1:/*Muestra todos los nombres*/
                        
for (j=0j<=ij++)
                            
printf("%s\n"usuario[j].nombre);
                        break;
                 case 
2:/*Muestra las personas de una cierta edad*/
                        
printf("\nEscriba la edad que tienen las personas que quiere ver: ");
                        
scanf("%d", &edad);
                        for (
j=0j<=ij++)
                            if (
usuario[j].edad==edadprintf("%s\n"usuario[j].nombre);
                        break;
                 case 
3:/*Muestra las personas con la inicial que se indique*/
                        
printf("Escriba la inicial: ");
                        
scanf("%c", &letra);
                        for (
j=0j<=ij++)
                            if (
letra==usuario[j].nombre[0]) printf("\n%s"usuario[j].nombre);
                        break;

                 case 
4:/*Sale del programa*/
                        
printf("Fin del programa, pulse Intro para cerrar");
                        
getchar();
                        break;
                 }
          }
          while (
opcion!=4);
      


Bueno, espero que lo que he hecho no sea demasiada barbaridad y que podais ayudarme. Muchas gracias!!!!!!

Última edición por xiroux; 10/07/2008 a las 11:18
  #2 (permalink)  
Antiguo 11/07/2008, 11:43
Avatar de Xinef  
Fecha de Ingreso: marzo-2007
Mensajes: 202
Antigüedad: 17 años, 1 mes
Puntos: 7
Respuesta: Novato intenta sin exito hacer un ejercicio de un curso de C

A mi me funciona bien.. el único problema es que se produce una captura del buffer de entrada, que hace que no te pida la letra...

Cambia el caso 3 por este código, y verás que funciona bien:

Código PHP:
case 3:/*Muestra las personas con la inicial que se indique*/
                        
printf("\nEscriba la inicial: ");
                        
getc(stdin);
                        
letra getchar();                        
                        for (
j=0j<=ij++)
                            if (
letra==usuario[j].nombre[0]) printf("\n%s"usuario[j].nombre);
                        break; 

Por cierto.. evita la función gets y cualquiera que no haga control de límite de entrada. Te pueden provocar un buffer overflow a la de ya... :)

Última edición por Xinef; 11/07/2008 a las 11:49 Razón: Comentar lo de gets.... :)
  #3 (permalink)  
Antiguo 11/07/2008, 12:32
 
Fecha de Ingreso: julio-2008
Mensajes: 2
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Novato intenta sin exito hacer un ejercicio de un curso de C

Muchas gracias Xinef, tu codigo me va a la pefeccion, pero no he entendido muy bien lo que me has dicho Lo del buffer overflow no se lo que es:, pero bueno, ahora lo buscare por algun lado a ver si me entero un poquito mas.
Lo que si que no entiendo es la forma de uilizar el getc, pero tambien la buscare, no quiero empezar en este foro nada mas que preguntando

Bueno, pues nada mas, gracias!!!
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 04:04.