Problema Programa C

Iniciado por pozo_23, 20 Diciembre 2016, 14:36 PM

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

pozo_23

Hola, estoy haciendo un programa en C y tengo un problema. Tengo la siguiente función:
void mostrarAlumnos(tipoAlumno alumnos[NALUMNOS],int contador){
   int i;
   
   
   
   printf("Los alumnos son:\n");
   
   for(i=0;i<contador;i++){
       
       puts(alumnos[i].nombre);
       printf("%s",alumnos[i].nombre);
       printf("DNI:%s\n",alumnos[i].identificador);
       printf("Curso:%d\n",alumnos[i].curso);
       printf("Telefono:%d\n",alumnos[i].telefono);
               
   }


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

engel lex

En ese código no parece haber problema, usa el debugger y analiza la lógica de tu programa
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

pozo_23

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?

engel lex

Los nombres deben ser un char bidimensionalla primera dimensión se mueve entre nombres, la segunda contiene cada letra del nombre
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MAFUS

Muestra la función donde adquieres los datos.

pozo_23

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);

}
   

MAFUS

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.

pozo_23

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

MAFUS

Para vaciar el buffer de entrada puedes usar:
while(getchar()!='\n');
Para adquirir una cadena:
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:
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.

pozo_23

Vale entiendo. Y para mostrar por pantalla, sigo utilizando puts? Mil gracias