Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - NOB2014

#51
Hola, ¿cómo están?
Una consulta rapidita, alguien me puede decir que estoy haciendo mal, el puntero que devuelve fgets nunca es nulo, ¿por qué? .-

do{
ok=1;
printf("\n Ingresa el nombre del alumno [%d]......:", max+1);
if( fgets( (b+max)->nombre, 30, stdin ) == NULL ){
ok=0;
printf( "\n El dato es obligatorio..." );
printf( "\n Pulsa <Enter> para intentarlo nuevamente..." ); getchar();
}
}while(!ok);
ajustes( (b+max)->nombre );


Saludos.
#52
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.
#53
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. -
#54
Hola, gracias por ocuparte. -
Me pregunto, al ser un array de estructura no debería hacer un bucle primero para liberar cada uno de los punteros, discúlpame la ignorancia. -
#55
Hoa, gente ¿cómo están?
Bueno no tengo mucho para agregar, por más que busco en internet no puedo encontrar un Ej. concreto de como liberar la memoria en una estructura dinámica. -

#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,i;
unsigned int ch=0;

printf("\n Ingresa la cantidad de alumnos.....:");
scanf("%d", &max);
b = ( alumno * )malloc( sizeof(alumno)*max );
for( i=0; i<max; i++){
printf("\n Ingresa el nombre del alumnos [%d].....:", i+1);
scanf( "%s", (b+i)->nombre );
while((ch = getchar()) !='\n' && ch!=EOF);
printf("\n Ingresa la direccion del alumno [%d]...:", i+1);
scanf( "%s", (b+i)->direccion );
while((ch = getchar()) !='\n' && ch!=EOF);
printf("\n Ingresa la edad del alumno [%d]........:", i+1);
scanf( "%d", &(b+i)->edad );
printf( "\n ================================================\n" );
}

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

return 0;
}


Si alguien me pondría un Ej. relacionado con el código, Danielito muy agradecido -
Saludos.
#56
Bien amigo es lo que necesitaba, me parece que me faltaba algún paréntesis por ello no lo podía hacer. -
Gracias.
#57
Hola, muy buen día para todos.
Hoy no les consulto por un error sino por algo que por más que busco en la web no encuentro la respuesta, ¿es posible agrupar desde la línea 10 a la 15 con un operador ternario y de no ser así me podrían dar alguna idea de como hacerlo con un #define? -

#include <stdio.h>

int d( char *a, char *b);

int main( void ){
char a[] = "rosita", b[] = "Rosita";
int res;

res = d( a, b );
if( res == 0 )
printf( "\n Las frases %s y %s son IGUALES\n\n", a, b );
else if( res < 0 )
printf( "\n %s es MAYOR que %s\n\n", a, b );
else
printf( "\n %s es MENOR que %s\n\n", a, b );

return 0;
}


// Lo que regresa la función: >0 si a<b ==> 0 si a==b ==> <0 si a>b
int d( char *a, char *b ){

for( ; *a == *b; a++, b++ )
if( *a == '\0' )
return 0;

return *a - *b;
}



Desde ya muchas gracias por el tiempo que le dediquen. -
Saludos.
#58
Ahora si nos entendemos, correctísimo, me funciona todo a la perfección, muchas gracias. - ;-) ;-) ;-)

Un abrazo.
#59
MAFUS, estas en lo correcto, para no romperme tanto la cabeza, ¿me podrías decir como apuntar al primer carácter de c sin efectuar un nuevo bucle? -


EDITO: Con la siguiente linea lo consigo, desconozco si hay una manera mejor. -
c -=7;

Saludos.
#60
Hola, gente ¿cómo están? ya los extrañaba. -
Estoy repasando punteros y me encuentro en el libro de los autores de C (creo que lo son) con esta función(d) que no logro hacer que de los resultados esperados, me podrían decir que estoy haciendo mal. -

#include <stdio.h>

void d( char *c, char *a);

int main( void ){
char a[] = "rosita", *b = "rosita", c[7];

printf("\n %s", a );
printf("\n %s \n\n ", b );

a[0] = 'R';
b = a;

printf("\n %s", a );
printf("\n %s \n\n ", b );

d( c, a );

return 0;
}



void d( char *c, char *a ){
while( (*c++ = *a++) )
;

printf("\n %s\n", c );
}

Saludos.