Pasar un campo(miembro) de una estructura a función por referencia.[C]

Iniciado por NOB2014, 17 Enero 2017, 15:09 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

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:
if((p=strchr((b+max)->nombre, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}
................................
if((p=strchr((b+max)->direccion, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}


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.

#include <stdio.h>
#include <stdlib.h>

typedef struct{
char nombre[30];
char direccion[30];
int edad;
}alumno;

int main( void ){
alumno *b=NULL;
int max=1, i, ch=0, seguir=0;
char *p = NULL;

do{
b = ( alumno * )realloc( b, (max)*sizeof(alumno));
if( b==NULL ){
printf("\n No se pudo asignar la memoria!");
exit(EXIT_FAILURE);
}
printf("\n Ingresa el nombre del alumno [%d]......:", max);
fgets( (b+max)->nombre, 30, stdin );

if((p=strchr((b+max)->nombre, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

printf("\n Ingresa la direccion del alumno [%d]...:", max);
fgets( (b+max)->direccion, 30, stdin );

if((p=strchr((b+max)->direccion, '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

printf("\n Ingresa la edad del alumno [%d]........:", max);
scanf( "%d", &(b+max)->edad );

printf( "\n distinto a \"0\" introduce otro alumno.: " );
scanf( "%d", &seguir );
max++;
}while( seguir != 0 );

for ( i=0; i<max; i++ ){
printf( "%s\t%s\t%d\n",(*(b+i)).nombre, (*(b+i)).direccion, (*(b+i)).edad );
}

free( b );

return 0;
}


Saludos y gracias. -
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

NOB2014

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:
void ajustes( char *tmp );
Las 2 llamadas:
ajustes( (b+max)->nombre );
ajustes( (b+max)->direccion );
La función:
void ajustes( char *tmp ){
char *p = NULL;
int ch;

if(( p=strchr( tmp , '\n'))){
*p='\0';
}else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

strcpy( tmp, "Arequito" );
}

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-