【发布时间】:2013-12-17 19:22:41
【问题描述】:
为了回到 C 编程流程,我一直在输入一些简单的测试程序。我在 scanf 函数中遇到了一个奇怪的问题。我在下面的代码中有 3 个,但只有前 2 个被初始化;第三个 scanf 被忽略。这是正常的,还是我做错了什么?我盯着这段代码看了半个小时,没有发现任何错误。
#include <stdio.h>
int math(int a, int b, char selection) {
int result;
switch (selection) {
case 'a':
result = a + b;
break;
case 's':
result = a - b;
break;
case 'm':
result = a * b;
break;
case 'd':
result = a / b;
break;
}
return result;
}
int main() {
int num1 = 0;
int num2 = 0;
int result = 0;
char selection;
printf("Enter first number: ");
scanf("%i", &num1);
printf("Enter second number: ");
scanf("%i", &num2);
printf("\n[a] Add\n[s] Subtract\n[m] Multiply\n[d] Divide\n\nWhich one: ");
scanf("%c", &selection);
result = math(num1, num2, selection);
printf("%i", result);
return 0;
}
【问题讨论】:
-
scanf 没有被忽略,它消耗了一个剩余的换行符。
-
要获得逐个字符的输入,请使用
fgetc()或getc()。要获取逐行用户输入,请使用fgets()。要从二进制文件中读取,请使用fread()(或 POSIX C 库中的read(),如果需要/可用)。 -
@JanD - 如果您看到他的许多答案,@H2CO3 对使用
scanf()有偏见,因为此功能隐藏的细微差别会让每个人都感到困惑。我不认为这很棘手,但使用文档和良好的调试技能,它真的不是那么糟糕的小功能 -
@Mike 好吧,除了它一贯倾向于导致缓冲区溢出,你的意思是?
-
@Mike 是的。然后您将缓冲区大小更改为 5,而您忘记更新硬编码大小。无时无刻不在发生。何必呢,既然你也可以使用
fgets(buf, sizeof buf, stdin)?