C 从开关调用函数时跳过代码
我有一个代码,假设它向用户询问汽车制造商,然后将其存储在txt文件中(这是C入门课程的一部分)。我有下面的菜单来调用int main中的函数C 从开关调用函数时跳过代码,c,C,我有一个代码,假设它向用户询问汽车制造商,然后将其存储在txt文件中(这是C入门课程的一部分)。我有下面的菜单来调用int main中的函数 while(1) { printf("Choice"); scanf("%i", &MENYVAL); switch(MENYVAL){ case 1 : ADDVEHICLE(); break; case 2 : read(); break
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如果您有答案,请将其放在答案部分,以便进行正常的同行评审。谢谢