Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: pozo_23 en 20 Diciembre 2016, 14:36 pm



Título: Problema Programa C
Publicado por: pozo_23 en 20 Diciembre 2016, 14:36 pm
Hola, estoy haciendo un programa en C y tengo un problema. Tengo la siguiente función:
Código
  1. void mostrarAlumnos(tipoAlumno alumnos[NALUMNOS],int contador){
  2.    int i;
  3.  
  4.  
  5.  
  6.    printf("Los alumnos son:\n");
  7.  
  8.    for(i=0;i<contador;i++){
  9.  
  10.        puts(alumnos[i].nombre);
  11.        printf("%s",alumnos[i].nombre);
  12.        printf("DNI:%s\n",alumnos[i].identificador);
  13.        printf("Curso:%d\n",alumnos[i].curso);
  14.        printf("Telefono:%d\n",alumnos[i].telefono);
  15.  
  16.    }

A la hora de llamar a la funcion en main, la funcion no me muestra el primer campo, nombre..  Deja un espacio en blanco y muestra los siguientes campos. Nombre lo tengo declarado como char[50] dentro de la estructura , y para guardar caracteres en este campo utilizo gets ¿Cual es el problema? Gracias de antemano

CoAdm: los códigos deben ir en etiquetas GeSHi, los títulos deben ser descriptivos


Título: Re: Problema Programa C
Publicado por: engel lex en 20 Diciembre 2016, 14:50 pm
En ese código no parece haber problema, usa el debugger y analiza la lógica de tu programa


Título: Re: Problema Programa C
Publicado por: pozo_23 en 20 Diciembre 2016, 14:58 pm
Creo que se cual es el problema. Cuando introduzco un nombre, por ejemplo francisco, en nombre[0] me aparece '\0' y en nombre[1] me aparece r, nombre[2]=a ... ¿Cómo puedo solucionar eso?


Título: Re: Problema Programa C
Publicado por: engel lex en 20 Diciembre 2016, 15:13 pm
Los nombres deben ser un char bidimensionalla primera dimensión se mueve entre nombres, la segunda contiene cada letra del nombre


Título: Re: Problema Programa C
Publicado por: MAFUS en 20 Diciembre 2016, 16:21 pm
Muestra la función donde adquieres los datos.


Título: Re: Problema Programa C
Publicado por: pozo_23 en 20 Diciembre 2016, 16:30 pm
void anadirAlumno( tipoAlumno alumno[NALUMNOS],int contador){
   
   
    int numero;
    int i;
   
   
   
    printf("Introducir Nombre y Apellidos:");
   
    getchar();
    fflush(stdin);
    gets(alumno[contador].nombre);
   
   
 
   
    printf("Introducir DNI:");
    scanf("%s",&alumno[contador].identificador);
    printf("Introducir curso:");
    scanf("%d",&alumno[contador].curso);
    printf("Introducir telefono:");
    scanf("%d",&alumno[contador].telefono);

}
   


Título: Re: Problema Programa C
Publicado por: MAFUS en 20 Diciembre 2016, 18:47 pm
Quita el getchar(); y fflush(stdin);

La primera te dará una falsa entrada por teclado y la segunda está desaconsejado ya que fflush solo se asegura para flujos de salida.

Más aún, no uses fgets. Es una antigua función que puede llegar a ser muy peligrosa. Desde el estándar C99 está desaconsejada y a partir del estándar C11 fue eliminada de la biblioteca.


Título: Re: Problema Programa C
Publicado por: pozo_23 en 20 Diciembre 2016, 19:12 pm
Y entonces que funcion deberia utilizar? Si utilizo fgets sin fflush y sin getchar(), cuando ejecuto el programa se salta  introducir nombre. y espera a que le de el siguiente campo


Título: Re: Problema Programa C
Publicado por: MAFUS en 20 Diciembre 2016, 19:47 pm
Para vaciar el buffer de entrada puedes usar:
Código
  1. while(getchar()!='\n');
Para adquirir una cadena:
Código
  1. scanf("%50[^\n]", alumnos[contador].nombre);
Con esto te va a adquirir toda la cadena, con un máximo de 50 caracteres hasta que se pulse la tecla ENTER, eso es con espacios y tabulaciones.
O
Puedes usar el siguiente código:
Código
  1. fgets(alumnos[contador].nombre, 50, stdin);
Con ello adquires toda la línea, incluido el retorno de carro, con un máximo de 50 caracteres.
Con cualquiera de las dos te aseguras que no se desborda la memoria del array.


Título: Re: Problema Programa C
Publicado por: pozo_23 en 20 Diciembre 2016, 20:47 pm
Vale entiendo. Y para mostrar por pantalla, sigo utilizando puts? Mil gracias


Título: Re: Problema Programa C
Publicado por: MAFUS en 20 Diciembre 2016, 21:03 pm
Sí, o printf. La que mejor convenga a cada necesidad.