有人可以告诉我为什么case 1
中的获取被完全忽略了吗?
// #define M 50 is at the top
char product[M] = {0};
int choice = -1;
printf("Command: ");
scanf("%d", &choice);
switch(choice){
case 0:
break;
case 1:
printf("Product: ");
gets(product);
insert_product(warehouse, price, product);
break;
case 2:
// print_all();
break;
default:
printf("Scelta non valida\n");
break;
}
答案 0 :(得分:5)
上一个输入中的结束字符可能会跳过获取。尝试在获取之前添加getchar()以查看是否存在问题。
答案 1 :(得分:1)
问题在于您在阅读choice
时输入的换行符:
scanf("%d", &choice);
被视为下一个gets(product);
的输入,因此它读取一个空字符串。尝试在getchar
之后添加人工scanf
以吸收换行符:
scanf("%d", &choice);
getchar();
现在应该工作。
答案 2 :(得分:1)
首先,重要的一点......
绝不永远不会使用gets
。永远。即使是练习代码。即使别人告诉你。它就像电影 Highlander II ;它最好假装从未存在过。它已在C99中弃用,并已从C2011中完全删除。不要使用它。不要试图通过声称这只是练习代码来证明使用它。如果其他人要求您使用它,请回过头告诉他们您将使用fgets
代替。如果他们给你带来悲伤,请把它们送给我,我会把它们整理出来。必要时用棒球棒。
好的,现在我已经清除了......
gets
正在从您为之前的scanf
来电输入的输入中获取尾随换行符。你有几个选择:
使用其他scanf
来代替gets
,这次使用%s
转换说明符(以及字段宽度);与gets
不同,它会跳过任何前导换行符;
在致电getchar()
之前,请致电gets
(或同等人)以使用换行符;
不使用choice
将scanf
作为整数阅读,而是使用fgets
将其作为文本阅读,并使用strtol
将其转换为整数。
选项3是最好的IMO。将呼叫混合到scanf
/ fscanf
和fgets
通常是导致胃灼热的一个因素,正是由于后续的换行问题。最好坚持使用一切中的一个或另一个。使用fgets
将所有内容作为文本读取的优点是它使输入验证更容易,尤其是对于数字输入。
答案 3 :(得分:0)
// #define M 50位于顶部
char product[M] = {0};
int choice = -1;
printf("Command: ");
scanf("%d", &choice);
switch(choice){
case 0:
break;
case 1:
printf("Product: ");
getchar();
gets(product);
insert_product(warehouse, price, product);
break;
case 2:
// print_all();
break;
default:
printf("Scelta non valida\n");
break;
}
答案 4 :(得分:-1)
在使用fflush(stdin)
作为输入之前使用gets
,因为gets
在使用scanf("%d", &choice);
之后将换行符作为输入
fflush(stdin)
清除输出缓冲区并将缓冲的数据移至控制台。