elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Introducir un nombre en un vector
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Introducir un nombre en un vector  (Leído 5,367 veces)
Qorin

Desconectado Desconectado

Mensajes: 16



Ver Perfil
Introducir un nombre en un vector
« en: 16 Noviembre 2010, 19:04 pm »

Veréis, necesito leer un nombre e introducirlo a un vector, son las condiciones del proyecto, no nos dejan usar la librería strings. Os muestro mi función leer_alumno y me decís que puede pasar, luego os muestro un ejemplo de ejecución.

Código
  1. void leer_persona (tlista *p)
  2. {
  3.    talumno alumno;
  4.     p->num_pers = 0;
  5.    int i, j = 0, n;
  6.    printf ("\nIntroduce la cantidad de alumnos que quieres guardar. Recuerda que el maximo es 200 alumnos: ");
  7.    scanf("%d", &n);
  8.    if (n < MAXALUMNO) {// Se ha de cumplir que el número de alumnos a introducir sea menor o igual a 200
  9.  
  10.      for (i = 0; i < n; i++)
  11.          {
  12.              printf("\nInformacion del ALUMNO%d\n", i+1);
  13.              printf("Introduce informacion con el siguiente formato(Nombre_apellidos:DNI 00000000X:anyo_ingreso):\n");  
  14.              //ENCONTRAR OTRA MANERA DE LEER EL NOMBRE
  15.      do{
  16.                 scanf("%c", &alumno.nombre[j]);
  17.                 j++;
  18.              }while (alumno.nombre[j-1] != ':' && j-1 < 20);
  19.              scanf("%8d%1c:%4d", &alumno.num_dni, &alumno.letra_dni, &alumno.fecha_ingreso);
  20.      printf("\n");
  21.              p->lista[i] = alumno;
  22.          } p->num_pers = n;
  23.    }
  24.    else {printf("El máximo de alumnos que puedes introducir es 200.\n");}
  25. }

La variable tlista p está inicializada en el main (), el programa es un menú con diferentes opciones, y en cada case va una función. Un ejemplo de ejecución para que veáis que es lo que puede fallar:

Código:
BIENVENIDOS AL PROGRAMA DE GESTIÓN DE EXPEDIENTES       

Escoge una operación a realizar:

 1. Introducir los datos de los expedientes.
 2. Mostrar todos los datos de los expedientes.
 4. Añadir o modificar el expediente de un alumno.
 5. Eliminar el expediente de un alumno a partir de su DNI.
 6. Mostrar los datos (Nombre, DNI y fecha de ingreso) de los alumnos que más tiempo llevan en la escuela.
 7. Mostrar el expediente de un alumno a partir de su DNI.
 13. Salir del programa.

Su opción es:1

Introduce la cantidad de alumnos que quieres guardar. Recuerda que el maximo es 200 alumnos: 2

Informacion del ALUMNO1
Introduce informacion con el siguiente formato(Nombre_apellidos:DNI 00000000X:anyo_ingreso):
alejandro:39427559Q:1992


Informacion del ALUMNO2
Introduce informacion con el siguiente formato(Nombre_apellidos:DNI 00000000X:anyo_ingreso):
fernando:11111111Q:1993

Escoge una operación a realizar:

 1. Introducir los datos de los expedientes.
 2. Mostrar todos los datos de los expedientes.
 4. Añadir o modificar el expediente de un alumno.
 5. Eliminar el expediente de un alumno a partir de su DNI.
 6. Mostrar los datos (Nombre, DNI y fecha de ingreso) de los alumnos que más tiempo llevan en la escuela.
 7. Mostrar el expediente de un alumno a partir de su DNI.
 13. Salir del programa.

Su opción es:2

alejandro:39427559Q:1992
:11111111Q:1993

Como vereis, cuando uso la función mostrar_datos, que muestra todos los expedientes guardados en la lista, el nombre del segundo no me lo muestra, creo que es porque ya directamente no entra en el while porque se cumple la condición de != ':' . Así que deduzco que el error viene por la función leer_alumnos y en concreto en la parte en la que leo el nombre del alumno y lo introduzco al vector.

Por si es necesario, la función mostrar datos es la siguiente:
Código
  1. talumno mostrar_datos(tlista *p){
  2.                             int i, k=0;
  3.                             for ( i = 0; i < p->num_pers ; i++) {
  4.                                 while (p->lista[i].nombre[k] != ':'){
  5. printf("%c", p->lista[i].nombre[k]);
  6. k++;
  7. }
  8.                                 printf(":%d%c:%d\n", p->lista[i].num_dni, p->lista[i].letra_dni, p->lista[i].fecha_ingreso); //Mostrar DNI y fecha de ingreso
  9.  
  10. } // Cerramos el for
  11. printf("\n");
  12.                                 } //Cerramos la función

Siento si no me he sabido explicar del todo bien, la asignatura no se me da mal, este es el primer proyecto importante que tengo y me gustaría que me saliera bien, si pudierais ayudarme con esta pequeña duda sería muy importante, porque me permitiría avanzar.


« Última modificación: 16 Noviembre 2010, 22:06 pm por Littlehorse » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Introducir un nombre en un vector
« Respuesta #1 en: 16 Noviembre 2010, 22:31 pm »

Postea el código completo (en lo posible en pastebin).

A simple vista, los errores podrian provenir del mal uso de scanf.
Al hacer esto:

Código
  1. scanf("%d", &n);
  2.  

En el buffer de entrada quedan datos (como el salto de linea, por ejemplo) que son leidos en la proxima lectura.

Luego, también hay otras cosas, como por ejemplo esto:

Código
  1.      do{
  2.                 scanf("%c", &alumno.nombre[j]);
  3.                 j++;
  4.              }while (alumno.nombre[j-1] != ':' && j-1 < 20);

Una manera poco eficiente e insegura de leer un nombre. Te recomiendo que utilices fgets con stdin + sscanf.

Por ejemplo:

Código
  1. fgets (buff , size , stdin);
  2. //Chequeas que la cadena este terminada en NULL y lo agregas en caso de ser necesario
  3. //Procesas el buffer, por ejemplo para eliminar datos que no necesitas u caracteres invalidos
  4. strncpy(_struct.nombre, buff, size); //Copias la cadena.
  5.  

Podes hacer algo similar para otros tipos de datos:

Código
  1. fgets(buff, size, stdin);
  2. //Procesas el buffer, por ejemplo para eliminar datos que no necesitas u caracteres invalidos
  3. sscanf(buff, "%d", &varint);

Por supuesto en todos los casos también podes chequear valores de retorno de cada función para evitar posibles errores.

Saludos!


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Qorin

Desconectado Desconectado

Mensajes: 16



Ver Perfil
Re: Introducir un nombre en un vector
« Respuesta #2 en: 16 Noviembre 2010, 23:08 pm »

Hola Littlehorse, gracias por prestarme un poquito de atención  :D, pero tengo que decirte que no nos dejan usar fgets ni sscanf...solamente : printf,scanf,for,while,do-while,if-else,vectores,matrices y funciones. Todo esto que te he dicho engloba el temario del cuatrimestre.

Me recomiendas que en todos los scanf añada un %*c para evitar posibles saltos de linea?
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Introducir un nombre en un vector
« Respuesta #3 en: 16 Noviembre 2010, 23:51 pm »


Citar
Me recomiendas que en todos los scanf añada un %*c para evitar posibles saltos de linea?

Podes hacerlo, funcionar va a funcionar. Recomendar no te lo recomiendo, pero si no te dejan utilizar otras funciones mas que las que mencionaste, muchas alternativas no quedan.

Saludos
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Introducir un nombre en un vector
« Respuesta #4 en: 17 Noviembre 2010, 04:22 am »

¡Buenas!

Si tienes problemas en tiempo de ejecucion, la clave esta en j. La inicializas al principio a cero, pero luego lo unico que haces es incementar su valor, asi que lo mas posible es que te salgas del rango del vector. Tienes que inicializarla a cero antes de la lectura de cada nombre.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Qorin

Desconectado Desconectado

Mensajes: 16



Ver Perfil
Re: Introducir un nombre en un vector
« Respuesta #5 en: 18 Noviembre 2010, 06:31 am »

Ey chicos! gracias! lo que hice fue, en vez de usar 1 sola función, usar 2, leer_alumno y leer_lista, así que en parte do-while hice lo que has mencionado, inicializar la i a 0 en cada vuelta del for  :D

Gracias!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Introducir elementos de un vector en orden
Programación C/C++
Katerina Dobreva 3 2,759 Último mensaje 15 Noviembre 2014, 11:54 am
por Eternal Idol
Filtro para no introducir un char en vector int.
Programación C/C++
antkk 2 1,856 Último mensaje 14 Marzo 2015, 17:43 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines