为什么 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()
留在缓冲区中的换行符。
我正在创建一些动态字符串,使用一个函数,该函数使用 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()
留在缓冲区中的换行符。