Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 17 Enero 2017, 15:09 pm



Título: Pasar un campo(miembro) de una estructura a función por referencia.[C]
Publicado por: NOB2014 en 17 Enero 2017, 15:09 pm
Hola, que tengan un muy buen día.
Tengo una duda y espero en primer lugar que se entienda lo que no logro hacer y luego que pueda alguien darme la solución. -

Estas líneas de código las quiero pasar a una función:
Código
  1. if((p=strchr((b+max)->nombre, '\n'))){
  2. *p='\0';
  3. }else{
  4. while((ch = getchar()) !='\n' && ch!=EOF);
  5. }
  6. ................................
  7. if((p=strchr((b+max)->direccion, '\n'))){
  8. *p='\0';
  9. }else{
  10. while((ch = getchar()) !='\n' && ch!=EOF);
  11. }
  12.  

En primer lugar, pasar un solo campo y no el total de la estructura.
luego que los cambios efectuados en la función llamada se vean reflejado en la función llamadora(main). -

El código completo.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct{
  5. char nombre[30];
  6. char direccion[30];
  7. int edad;
  8. }alumno;
  9.  
  10. int main( void ){
  11. alumno *b=NULL;
  12. int max=1, i, ch=0, seguir=0;
  13. char *p = NULL;
  14.  
  15. do{
  16. b = ( alumno * )realloc( b, (max)*sizeof(alumno));
  17. if( b==NULL ){
  18. printf("\n No se pudo asignar la memoria!");
  19. exit(EXIT_FAILURE);
  20. }
  21. printf("\n Ingresa el nombre del alumno [%d]......:", max);
  22. fgets( (b+max)->nombre, 30, stdin );
  23.  
  24. if((p=strchr((b+max)->nombre, '\n'))){
  25. *p='\0';
  26. }else{
  27. while((ch = getchar()) !='\n' && ch!=EOF);
  28. }
  29.  
  30. printf("\n Ingresa la direccion del alumno [%d]...:", max);
  31. fgets( (b+max)->direccion, 30, stdin );
  32.  
  33. if((p=strchr((b+max)->direccion, '\n'))){
  34. *p='\0';
  35. }else{
  36. while((ch = getchar()) !='\n' && ch!=EOF);
  37. }
  38.  
  39. printf("\n Ingresa la edad del alumno [%d]........:", max);
  40. scanf( "%d", &(b+max)->edad );
  41.  
  42. printf( "\n distinto a \"0\" introduce otro alumno.: " );
  43. scanf( "%d", &seguir );
  44. max++;
  45. }while( seguir != 0 );
  46.  
  47. for ( i=0; i<max; i++ ){
  48. printf( "%s\t%s\t%d\n",(*(b+i)).nombre, (*(b+i)).direccion, (*(b+i)).edad );
  49. }
  50.  
  51. free( b );
  52.  
  53. return 0;
  54. }

Saludos y gracias. -


Título: Re: Pasar un campo(miembro) de una estructura a función por referencia.[C]
Publicado por: NOB2014 en 17 Enero 2017, 17:53 pm
Creo que es la primera vez que logro la solución de algo antes que me respondan en este foro tan dinámico, dejo a continuación como lo hice y me gustaría que alguien me diga como comprobar si realmene se ha insertado el fin de cadena (\0) en el caso de haber ingresado menos de 29 caracteres (obvio con fgets). - 

prototipo:
Código
  1. void ajustes( char *tmp );
Las 2 llamadas:
Código
  1. ajustes( (b+max)->nombre );
  2. ajustes( (b+max)->direccion );
  3.  
La función:
Código
  1. void ajustes( char *tmp ){
  2. char *p = NULL;
  3. int ch;
  4.  
  5. if(( p=strchr( tmp , '\n'))){
  6. *p='\0';
  7. }else{
  8. while((ch = getchar()) !='\n' && ch!=EOF);
  9. }
  10.  
  11. strcpy( tmp, "Arequito" );
  12. }
Saludos.