Autor
|
Tema: Problema Programa C (Leído 3,494 veces)
|
pozo_23
Desconectado
Mensajes: 8
|
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; for(i=0;i<contador;i++){ 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
|
|
« Última modificación: 20 Diciembre 2016, 14:48 pm por engel lex »
|
En línea
|
|
|
|
engel lex
|
En ese código no parece haber problema, usa el debugger y analiza la lógica de tu programa
|
|
|
En línea
|
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
Desconectado
Mensajes: 8
|
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?
|
|
|
En línea
|
|
|
|
engel lex
|
Los nombres deben ser un char bidimensionalla primera dimensión se mueve entre nombres, la segunda contiene cada letra del nombre
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.603
|
Muestra la función donde adquieres los datos.
|
|
|
En línea
|
|
|
|
pozo_23
Desconectado
Mensajes: 8
|
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);
}
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
pozo_23
Desconectado
Mensajes: 8
|
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
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Para vaciar el buffer de entrada puedes usar:
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.
|
|
|
En línea
|
|
|
|
pozo_23
Desconectado
Mensajes: 8
|
Vale entiendo. Y para mostrar por pantalla, sigo utilizando puts? Mil gracias
|
|
|
En línea
|
|
|
|
|
|