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é fgets no obtiene la primera entrada?

Estoy creando varias cadenas dinámicas usando una función que utiliza fgets para obtener la entrada del usuario. Pero la primera vez que intento obtener el nombre del aeropuerto, simplemente “salta” el proceso automáticamente poniendo \n en “temp” y continúa la función. Todos los demás campos de entrada están correctos excepto el primero.

Por favor, introduce el nombre del aeropuerto:
Aquí simplemente se salta el proceso de entrada y muestra directamente “introduzca la dirección”:


Por favor, introduce el nombre del país:

Por favor, introduce el nombre de la ciudad:

int initAirport(Airport* airportP)
{
airportP->nameOfAirPort = createDynamicString(“Por favor, introduce el nombre del aeropuerto:\n”);
printf(“———-Por favor, introduce la dirección————-\n”);
airportP->country = createDynamicString(“Por favor, introduce el nombre del país:\n”);
airportP->city = createDynamicString(“Por favor, introduce el nombre de la ciudad:\n”);
airportP->address = createDynamicString(“Por favor, introduce el nombre de la dirección:\n”);
printf(“Por favor, introduce el número de la casa:\n”);
scanf(“%d”,&(airportP->houseNumber));
return 1;
}

char* createDynamicString(const char* msg)
{
char* str;
char temp[254];
printf(msg);
fgets(temp,254,stdin);
str = (char*)malloc((strlen(temp)+1) * sizeof(char));
if (!str)
return NULL;
strcpy(str, temp);
//str[strlen(str) – 1] = 0;
return str;
}

#pragma once

#define MAX 254

typedef struct
{
char* nameOfAirPort;
char* country;
char* city;
char* address;
int houseNumber;

} Airport;

int initAirport(Airport* pNameOfAirport);
void addNumberSignToString(char* stringOfNumberSign);
void printNameOfAirport(const Airport* pNameOfAirport);
int isSameAirport(Airport* airport1P, Airport* airport2P);
int isAirportName(Airport* airportP, char* airportName);
void freeAirport(Airport* airportP);

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema mencionado ocurre porque fgets lee el carácter de nueva línea ‘\n’ que se ingresa después de que el usuario introduce el nombre del aeropuerto. El carácter de nueva línea se almacena en el búfer temporal llamado temp. Esto hace que el siguiente fgets lea el carácter de nueva línea y continúe sin tomar la entrada del usuario. Para solucionar este problema, es necesario eliminar el carácter de nueva línea del búfer de entrada antes de que se utilice para crear una cadena dinámica. Esto se puede lograr descomentando la siguiente línea en la función createDynamicString:

    str[strlen(str) - 1] = 0;
    

    Esta línea elimina el carácter de nueva línea del búfer y evita que interfiera en el proceso de entrada de las siguientes solicitudes.

Comments are closed.