【问题标题】:Code skipped when calling function from switch [duplicate]从开关调用函数时跳过代码[重复]
【发布时间】:2020-04-19 15:26:38
【问题描述】:

我有一个代码,假设向用户询问汽车制造商,然后将其存储在 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”之后添加以下代码(我相信它会尝试刷新缓冲区)请参阅link 以获得灵感:

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

没有成功。

PS。我正在linux VM上编程,但不确定使用标签是否正确,如果标签不正确,我深表歉意

【问题讨论】:

  • 'scanning "MENYVAL=1"' 你的意思是字面意思吗?因为你的程序只接受一个数字,而不是一个 "MENUVAL=" 前缀
  • 本题中没有显示可以输出“Manufacturer Choice”的代码。出示您的minimal reproducible example
  • “代码读取 ADDVEHICLE 中的打印,然后返回 int main 中的切换代码而不要求输入。” 我们无法知道 ADDVEHICLE 做了什么,因为您没有向我们展示(有代替 ADDFORDON)
  • scanf("%i", &MENYVAL); 将换行符留在缓冲区中,因此 fgets 扫描为空。
  • @KamilCuk 如果您有答案,请将其放在答案部分,以便进行正常的同行评审,谢谢

标签: c


【解决方案1】:

可能在switch 之前执行scanf() 之后剩余的'\n' 字符在ADDFORDON() 函数内部被fgets() 调用读取。在fgets() 之前添加“buffer flusher”,如下所示:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多