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
En ese código no parece haber problema, usa el debugger y analiza la lógica de tu programa
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?
Los nombres deben ser un char bidimensionalla primera dimensión se mueve entre nombres, la segunda contiene cada letra del nombre
Muestra la función donde adquieres los datos.
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);
}
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.
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
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.
Vale entiendo. Y para mostrar por pantalla, sigo utilizando puts? Mil gracias
Sí, o printf. La que mejor convenga a cada necesidad.