es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no funciona la entrada utilizando gets con el operador de flecha? ¿Cuál es el error?

¿Cuál es el error en esto?
Intenté tomar una entrada utilizando el operador de flecha.

#include <stdio.h>

typedef struct{
  char name[100];
  int salary;
}emp;

void inp(emp *e){
  printf("Ingrese el nombre: ");
  gets(e->name);
  printf("Ingrese el salario: ");
  scanf("%d", &(e->salary));
}

int main() {
    emp *e1,*e2;
    inp(e1);
    inp(e2);
    printf("%s, %d\n", e1->name, e1->salary);
    printf("%s, %d\n", e2->name, e2->salary);
    return 0;
}

He intentado poner & e incluso darle a la función inp como tipo emp, pero no funciona.
Solo me pide el nombre del primer empleado. ¡Eso es todo!
Ni siquiera imprime el mensaje “Ingrese el salario”.
¿Qué cambios debo hacer?</stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error está en la línea scanf("%d", e->salary);. El especificador de formato correcto para la entrada de un entero usando scanf es %d, pero e->salary es un puntero a un entero. Por lo tanto, debemos usar el especificador de formato %d con la dirección de la variable usando el operador &. La línea correcta debería ser:

    scanf("%d", &e->salary);
    

    Además, los punteros e1 y e2 no están apuntando a ninguna ubicación de memoria. Por lo tanto, necesitamos asignar memoria antes de pasarlos a la función inp(). Podemos usar la función malloc() para asignar memoria de forma dinámica. La función main corregida debería ser:

    int main() {
            emp *e1, *e2;
            e1 = (emp*) malloc(sizeof(emp)); // asignando memoria para e1
            e2 = (emp*) malloc(sizeof(emp)); // asignando memoria para e2
            inp(e1);
            inp(e2);
            printf("%s , %d\n", e1->name, e1->salary);
            printf("%s , %d\n", e2->name, e2->salary);
            free(e1); // liberando memoria para e1
            free(e2); // liberando memoria para e2
            return 0;
        }
    

    Ten en cuenta que después de usar malloc(), necesitamos liberar la memoria utilizando la función free().

Comments are closed.