在C中输入函数后出现Printf()错误

在C中输入函数后出现Printf()错误,c,C,您好,我在输入AddEmployee()函数时遇到了一个问题 输入时,我希望它打印出“First Name”以提示用户输入名字,但它打印出以下内容: ::Add Employee:: First Name:Last Name: 因此,用户输入的不是名字,而是扫描的姓氏 如何更改代码,使其不会打印出来 First Name:Last Name: 而是 First Name: (whatever user enters) Last Name: (whatever user enters) 这是

您好,我在输入AddEmployee()函数时遇到了一个问题

输入时,我希望它打印出“First Name”以提示用户输入名字,但它打印出以下内容:

::Add Employee::
First Name:Last Name:
因此,用户输入的不是名字,而是扫描的姓氏

如何更改代码,使其不会打印出来

First Name:Last Name:
而是

First Name: (whatever user enters)
Last Name: (whatever user enters)
这是我写的代码

#include <stdio.h>
#include <math.h>
#include <string.h>

struct Employee{

char FirstName[16];
char LastName[16];
char Address[21];
char ID[4];
char Duration[4];

};

void MainMenu();
void AddEmployee();


int main(int argc, char *argv[]) 
{
    MainMenu(); 
}


void MainMenu()
{   
    int main_menu = 0;

    printf("::Main Menu::\n");
    printf("1.) Add Employee:\n");
    scanf("%d", &main_menu);

    switch (main_menu) 
    {
        default:
        {
            printf("Invalid Choice!");
            break;
        }
        case(1):
        {
            AddEmployee();
            break;
        }
    }
}


void AddEmployee()
{   
    struct Employee employee;

    printf("::Add Employee::\n");
    printf("First Name:");
    fgets(employee.FirstName, 16, stdin);
    printf("Last Name:");
    fgets(employee.LastName, 16, stdin);

}
#包括
#包括
#包括
结构雇员{
char FirstName[16];
char LastName[16];
字符地址[21];
字符ID[4];
字符持续时间[4];
};
void main菜单();
无效雇主();
int main(int argc,char*argv[])
{
主菜单();
}
void主菜单()
{   
int主菜单=0;
printf(“::主菜单::\n”);
printf(“1.)添加员工:\n”);
scanf(“%d”和主菜单);
开关(主菜单)
{
违约:
{
printf(“无效选择!”);
打破
}
案例(1):
{
AddEmployee();
打破
}
}
}
void AddEmployee()
{   
结构员工;
printf(“::添加员工::\n”);
printf(“名字:”);
fgets(员工姓名,16,标准名称);
printf(“姓氏:”);
fgets(employee.LastName,16,标准输入);
}
使用getchar()读取缓冲区中剩余的“\n”来清除输入缓冲区

void AddEmployee()
{   
    struct Employee employee;

    printf("::Add Employee::\n");
    printf("First Name:");
    getchar();
    fgets(employee.FirstName, 16, stdin);
    printf("Last Name:");
    fgets(employee.LastName, 16, stdin);

}
即使在main()中的scanf()之后,也可以添加getchar()


考虑到@Mike的注释,最好将getchar()放在main()中原始scanf()之后,这会导致缓冲区中剩余的
\n

这不会消耗
\n
scanf(“%d”,&main\u菜单)。因此,第一个
fgets()
正在使用用户第一次输入的
\n
。@hmjd,为什么这不是一个答案?@CarlNorum,我没有提供一个解决方案,这只是行为的原因。不要将
scanf()
fgets()
@StephenFox-
scanf()
fgets()混为一谈
以不同方式处理换行符。所以,如果你把它们混在一起,你需要知道你最后使用了哪一种输入,以确保你正确地处理换行符。这比它的价值更让人头疼。将
getchar()
放在这里假设在调用此函数之前,
stdin
上总会有一些挂起的内容。对于当前编写的代码来说,这可能是正确的,但这不是一个好主意,最好在原始的
scanf()
调用之后直接清除
'\n'
。@Mike ok。我补充了这个来回答
 printf("::Main Menu::\n");
    printf("1.) Add Employee:\n");
    scanf("%d", &main_menu);
    getchar();
    switch (main_menu) 
    {
        default:
        {
            printf("Invalid Choice!");
            break;
        }
        case(1):
        {
            AddEmployee();
            break;
        }