C 从开关调用函数时跳过代码

C 从开关调用函数时跳过代码,c,C,我有一个代码,假设它向用户询问汽车制造商,然后将其存储在txt文件中(这是C入门课程的一部分)。我有下面的菜单来调用int main中的函数 while(1) { printf("Choice"); scanf("%i", &MENYVAL); switch(MENYVAL){ case 1 : ADDVEHICLE(); break; case 2 : read(); break

我有一个代码,假设它向用户询问汽车制造商,然后将其存储在txt文件中(这是C入门课程的一部分)。我有下面的菜单来调用int main中的函数

while(1)
{
     printf("Choice");
     scanf("%i", &MENYVAL);
    switch(MENYVAL){
            case 1 : ADDVEHICLE();      break;
            case 2 : read();            break;
            default: printf("No choice was made");
    }
            printf("\tChoice");
            scanf("%i", &MENYVAL);
}
其中“ADDVEHICLE”是以下功能

void ADDVEHICLE() {
FILE *fp;
char CAR[50];

fp = fopen("FILE.txt", "a");

if(!fp) {
    printf("ERROR");
}

printf("\n Manufacturer");
fgets(CAR, sizeof(CAR), stdin);
fprintf(fp, "%s", CAR);

fclose(fp);}
运行程序并扫描“MENYVAL=1”时 我得到输出

Manufacturer Choice
也就是说,代码读取ADDVEHICLE中的打印,但随后返回int main中的开关代码,而不要求输入

尝试: 如果我删除开关代码,只调用函数ADDVEHICLE,代码工作正常,我可以输入存储在正确txt文件中的文本

我测试了在“fprinf”之后添加以下代码(我相信它会尝试刷新缓冲区),请参阅以获取灵感:

while (!EOF) { fprintf(fp, "%s", "\t");} 
没有成功


另外,我正在linux虚拟机上编程,但我不确定使用标记是否正确,如果标记不正确,我深表歉意。

可能执行
scanf()
开关之前的
后剩余的“\n”字符会通过
fgets()
调用在
ADDFORDON()
函数中读取。在
fgets()之前添加“缓冲区冲洗器”,如下所示:

void ADDVEHICLE() {
    FILE *fp;
    char CAR[50];

    fp = fopen("FILE.txt", "a");

    if (!fp) {
        printf("ERROR");
    }

    // flush buffer here!
    scanf("%s"); // this reads any characters remaining in input buffer then ignores them

    printf("\n Manufacturer");

    fgets(CAR, sizeof(CAR), stdin);
    fprintf(fp, "%s", CAR);

    fclose(fp);
}

执行
scanf()
之后
switch
之前剩余的“\n”字符可能是通过调用
fgets()
ADDFORDON()
函数中读取的。在
fgets()之前添加“缓冲区冲洗器”,如下所示:

void ADDVEHICLE() {
    FILE *fp;
    char CAR[50];

    fp = fopen("FILE.txt", "a");

    if (!fp) {
        printf("ERROR");
    }

    // flush buffer here!
    scanf("%s"); // this reads any characters remaining in input buffer then ignores them

    printf("\n Manufacturer");

    fgets(CAR, sizeof(CAR), stdin);
    fprintf(fp, "%s", CAR);

    fclose(fp);
}

'扫描“MENYVAL=1”'你的意思是真的吗?因为您的程序只接受一个数字,而不接受“MENUVAL=”前缀,所以本问题中没有显示可以输出“制造商选择”的代码。出示您的。“代码读取ADDVEHICLE中的打印,但随后返回int main中的开关代码,而不要求输入。”我们无法知道ADDVEHICLE的功能,因为您没有向我们显示它(而是ADDFORDON)
scanf(“%i”,&MENYVAL)
将换行保留在缓冲区中,因此
fgets
扫描为空。@KamilCuk如果您有答案,请将其放在可以接受正常同行审查的答案部分。谢谢您“扫描”MENYVAL=1“,您的意思是真的吗?因为您的程序只接受一个数字,而不接受“MENUVAL=”前缀,所以本问题中没有显示可以输出“制造商选择”的代码。出示您的。“代码读取ADDVEHICLE中的打印,但随后返回int main中的开关代码,而不要求输入。”我们无法知道ADDVEHICLE的功能,因为您没有向我们显示它(而是ADDFORDON)
scanf(“%i”,&MENYVAL)
将换行保留在缓冲区中,因此
fgets
扫描为空。@KamilCuk如果您有答案,请将其放在答案部分,以便进行正常的同行评审。谢谢