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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con cadena de caracteres y estructura (Novato)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con cadena de caracteres y estructura (Novato)  (Leído 1,623 veces)
alejandrodiaz

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Problema con cadena de caracteres y estructura (Novato)
« en: 1 Enero 2016, 23:47 pm »

Primero quisiera aclarar que soy novato programando, estoy apenas aprendiendo punteros y por eso no se lo he integrado al siguiente codigo.

Estoy intentanto realizar un programa para el control de notas. Ya logré fijar y mostrar los nombres y apellidos de los estudiantes, luego introduje los nombres de las materias en una variable char en el Main, para luego copiarlos con strcpy a cada estructura (Me imagino que hay mejores formas de hacerlo pero esta es la que mi ignorancia me permite, por ahora)

Mi problema es que al introducir las notas, el nombre de la primera materia se mantiene pero el resto de los nombres se pierde, mostrandome ASCII. Verifiqué antes de llegar a esa parte del código y los nombres se guardan bien pero despues de alli se daña. Que consejos me dan?

Aca el código:

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3. #define MAX 10
  4.  
  5. typedef struct asignaturas{
  6. char nombre[MAX];
  7. int nota[4];
  8. }asignatura;
  9.  
  10. typedef struct estudiantes{
  11. char nombre[MAX];
  12. char apellido[MAX];
  13. asignatura materia[3];
  14. }escolar;
  15.  
  16. escolar DatosAlum();
  17. escolar IntroNota(int cant_alum,int indice);
  18.  
  19.  
  20. int main(){
  21.  
  22. int cant_alum, i,j;
  23. char nom_mate[3][MAX];
  24.  
  25.  
  26. printf("Introduzca cantidad de alumnos: \n");
  27. scanf("%d",&cant_alum);
  28.  
  29. escolar alumno[cant_alum];       //Declarando variable tipo struct "escolar"
  30.  
  31. for(i=0;i<cant_alum;i++){
  32. printf("Alumno nro %d: \n", i+1);    
  33. alumno[i]=DatosAlum();               //Introduciendo nombres y apellidos de alumnos
  34. }
  35.  
  36. printf("Introduzca nombre de materias: \n");
  37. for(i=0;i<3;i++){
  38. printf("Materia nro %d: ",i+1);
  39. fflush(stdin);
  40. gets(nom_mate[i]);
  41. }
  42.  
  43. for(i=0;i<cant_alum;i++){
  44. for(j=0;j<3;j++){
  45. strcpy(alumno[i].materia[j].nombre,nom_mate[j]);     //Aca copìo y pego los nombres en  las estructuras.
  46. }
  47. }
  48.  
  49.  
  50. printf("Introduzca notas: \n");
  51. for(i=0;i<cant_alum;i++){
  52. printf("Alumno: %s %s\n",alumno[i].nombre,alumno[i].apellido);
  53. for(j=0;j<3;j++){
  54. printf("Materia: %s \n",alumno[i].materia[j].nombre);  //Aqui se daña mi codigo
  55.                                                                //El primer nombre se imprime bien, el resto sale mal.
  56. alumno[i]=IntroNota(cant_alum,j);
  57. printf("valor de j= %d",j);
  58. }
  59. }
  60.  
  61.  
  62. return 0;
  63. }
  64.  
  65. escolar DatosAlum(){
  66. escolar alumno;
  67.  
  68. printf("Nombre: ");
  69. fflush(stdin);
  70. gets(alumno.nombre);
  71.  
  72. printf("Apellido: ");
  73. fflush(stdin);
  74. gets(alumno.apellido);
  75.  
  76. return alumno;
  77. }
  78.  
  79. escolar IntroNota(int cant_alum,int indice){
  80. escolar alumno;
  81. int i;
  82.  
  83. for(i=0;i<4;i++){
  84. printf("Nota %d: \n",i+1);
  85. scanf("%d",&alumno.materia[indice].nota[i]);
  86. }
  87.  
  88. return alumno;
  89. }
  90.  


« Última modificación: 6 Enero 2016, 17:48 pm por alejandrodiaz » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con cadena de caracteres y estructura (Novato)
« Respuesta #1 en: 2 Enero 2016, 00:42 am »

Algunas cosillas:

El uso de gets te puede llevar a problemas si introducen un dato mas largo de lo que puedes alojar.

Para usaro getch() debes introducir la cabecera conio.h, que es una librería que solo usa el compilador de Borland, aunque hay librerías independientes que ofrecen compatibilidad, no está bien visto el usarla. Está tan mal vista o mas que goto.

fflush(stdin) es muy mal hábito. No tendrá el efecto deseado en muchos compiladores, por lo que debes encontrar otra forma de vaciar el buffer.



La función IntroNota() está mal diseñada. Pides la cantidad de alumnos con cant_alum, pero no haces nada con ella. Regresas un dato de tipo alumno, rellenado con las notas, eso sí, pero que no tiene nombre y con esto machacas al alumno que está en main(): ahora tendrá las notas, pero los nombres, apellidos y los nombres de las materias son sustituidos por basura.
Posibles soluciones: punteros y pasar el alumno por referencia, pero no has aprendido a usarlos aún.  Podrías hacer un array de alumnos global, pero entonces no podrías indicar en tiempo de ejecución cuántos alumnos tienes. Tu única solución, por ahora, es que el código para introducir las notas esté dentro de main() así el programa te funcionará.


En línea

alejandrodiaz

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Problema con cadena de caracteres y estructura (Novato)
« Respuesta #2 en: 6 Enero 2016, 17:47 pm »

Muchas gracias por la respuesta, tomaré en cuenta todo lo que has dicho referente a l gets, getch,fflush.


Hice lo que dijiste, realice todo en main y funcionó correctamente, solo hice una función extra para imprimir.  Seguiré estudiando punteros para hacerlo como dices, ya que de esa forma es que quiero que me quede el código.

Gracias!
En línea

lfgmespino

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Problema con cadena de caracteres y estructura (Novato)
« Respuesta #3 en: 18 Enero 2016, 00:25 am »

Yo lo he resuelto así, pero tiene punteros, claro.
Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define MAX 10
  5.  
  6. typedef struct asignaturas{
  7. char nombre[MAX];
  8. int nota[4];
  9. }asignatura;
  10.  
  11. typedef struct estudiantes{
  12. char nombre[MAX];
  13. char apellido[MAX];
  14. asignatura materia[3];
  15. }escolar;
  16.  
  17. void DatosAlum(escolar *alumno);
  18. void IntroNota(asignatura *materia, int indice);
  19.  
  20.  
  21. int main(){
  22.  
  23. int cant_alum, i,j;
  24. char nom_mate[3][MAX];
  25. escolar *alumno;
  26.  
  27.  
  28. printf("Introduzca cantidad de alumnos: \n");
  29. scanf("%d",&cant_alum);
  30.  
  31.    alumno = (escolar *) malloc(sizeof(escolar) *cant_alum);       //Declarando variable tipo struct "escolar"
  32.  
  33. for(i=0;i<cant_alum;i++) {
  34. printf("Alumno nro %d: \n", i+1);    
  35. DatosAlum(&alumno[i]);               //Introduciendo nombres y apellidos de alumnos
  36.     }
  37.  
  38. printf("Introduzca nombre de materias: \n");
  39. for(i=0;i<3;i++){
  40. printf("Materia nro %d: ",i+1);
  41. fflush(stdin);
  42. gets(nom_mate[i]);
  43. }
  44.  
  45. for(i=0;i<cant_alum;i++) {
  46. for(j=0;j<3;j++) {
  47. strcpy(alumno[i].materia[j].nombre,nom_mate[j]);     //Aca copìo y pego los nombres en  las estructuras.
  48.        }
  49.     }
  50.  
  51.  
  52. printf("Introduzca notas: \n");
  53. for( i=0; i<cant_alum; i++){
  54. printf("Alumno: %s %s\n", alumno[i].nombre, alumno[i].apellido);
  55. for( j=0; j<3; j++) {
  56. printf("Materia: %s \n",alumno[i].materia[j].nombre);  
  57. IntroNota( alumno[i].materia[i].nota, j);
  58.    printf("\nvalor de j= %d", j);
  59. }
  60. }
  61.  
  62.  
  63. return 0;
  64. }
  65.  
  66. void DatosAlum(escolar *alumno){
  67.  
  68. printf("Nombre: ");
  69. fflush(stdin);
  70. gets(alumno->nombre);
  71.  
  72. printf("Apellido: ");
  73. fflush(stdin);
  74. gets(alumno->apellido);
  75.  
  76. }
  77.  
  78. void  IntroNota(asignatura *materia, int indice)
  79. {
  80. int i;
  81.  
  82. for( i=0; i<4; i++) {
  83. printf("Nota %d: \n",i+1);
  84. scanf("%d", &(materia[indice].nota[i]) );
  85. }
  86.  
  87. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con el tamaño de una estructura y/o cadena en Dev-C++
Programación C/C++
BlerofonT 4 3,449 Último mensaje 8 Abril 2018, 10:52 am
por eduu15
Ayuda!!! Problema con cadena de caracteres
Programación C/C++
mathias_vg 5 3,946 Último mensaje 26 Junio 2013, 19:47 pm
por leosansan
Problema con cadena de caracteres en C. « 1 2 »
Programación C/C++
GilbertoBrewer 10 4,351 Último mensaje 21 Noviembre 2014, 06:56 am
por GilbertoBrewer
Problema pegar caracteres en cadena.
Programación C/C++
Kaxperday 1 1,493 Último mensaje 15 Febrero 2015, 21:15 pm
por engel lex
Duda sobre problema de cadena de caracteres.
Programación C/C++
rafacg96 1 1,459 Último mensaje 2 Diciembre 2015, 07:11 am
por class_OpenGL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines