为什么 fgets 不获取第一个输入?

Why doesn't fgets get the first input?

我正在创建一些动态字符串,使用一个函数,该函数使用 fgets 从用户那里获取输入。但是当我第一次尝试获取机场名称时,它只是“跳过”fgets 自动将 \n 放入 temp 并继续该功能。所有其他输入都是正确的,而不是第一个。

Please enter name of Airport:

这里只是跳过输入过程,直接打印“输入地址”:

----------Please enter the address-------------

Please enter name of country:

Please enter name of city:
int initAirport(Airport* airportP)
{
    airportP->nameOfAirPort = createDynamicString("Please enter name of Airport:\n");
    printf("----------Please enter address-------------\n");
    airportP->country = createDynamicString("Please enter name of country:\n");
    airportP->city = createDynamicString("Please enter name of city:\n");
    airportP->address = createDynamicString(" Please enter name of Address:\n");
    printf("Please enter house number:\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);

scanf() 将换行符留在缓冲区中,然后 fgets() 在用户有机会输入任何内容之前将其拾取并退出。

您必须在 scanf()

之后清除缓冲区
void clearInputBuffer(void)
{
    int c;
    do {
        c = getchar();
    } while (c != '\n' && c != EOF);
}

检查这个问题:scanf() leaves the newline character in the buffer

在您使用 scanf() 函数后,scanf() 会在您的缓冲区中留下一个换行符 \n。然后, initAirport 函数中的 fgets() 出现,它采用换行符,您无法输入。但这只会发生一次,因为下次你调用 createDynamicString 函数时,你会使用 fgets() 函数,而不是 scanf().

您可以在第一次调用 scanf() 函数后输入此代码示例,您所说的那个函数存在并询问用户是否要添加机场,然后调用另一个调用 initAirport():

while (getchar() != '\n');

这基本上会获取缓冲区中的现有字母,直到遇到换行符。在这种情况下,这将过滤掉 scanf() 留在缓冲区中的换行符。