为了回到C编程的流程中,我一直在输入一些简单的测试程序。我在扫描功能中遇到了一个奇怪的问题。我在下面的代码中有 3 个,但只有前 2 个被初始化;第三个扫描将被忽略。这正常,还是我做错了什么?在过去的半个小时里,我一直盯着这段代码,找不到任何错误。
#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] Addn[s] Subtractn[m] Multiplyn[d] DividennWhich one: ");
scanf("%c", &selection);
result = math(num1, num2, selection);
printf("%i", result);
return 0;
}
要回答您的全部问题:
scanf 函数的使用次数是否有限制?
不,没有。
但无论如何,这不是这里发生的事情。
当你做这样的事情时:
printf("Enter second number: ");
scanf("%i", &num2);
您实际上是在stdin
上输入两个值,第一个是数字,第二个是不可见的换行符。
you can't see that, but it's there
V
> Enter second number: 3n
scanf()
的工作方式是,它将读取输入并将其存储在stdin
到变量中,直到它们全部填充,然后它将保留其余部分。在我的示例中,3
被存储到num2
'n'
保留在stdin
然后当此代码运行时:
scanf("%c", &selection);
它会在stdin
上看,并找到换行符('n'
)坐在那里。这可以存储为字符类型,因此它将用它填充selection
。
解决此问题的一种方法是将代码更改为:
scanf(" %c", &selection);
%
前面的空格告诉scanf
忽略stdin
缓冲区开头的任何空格(包括换行符)。
关于调试的旁注:
当您认为出现问题时,请使用调试器或打印一些值以使您有信心和理解。例如,我会这样更新您的代码:
printf("n[a] Addn[s] Subtractn[m] Multiplyn[d] DividennWhich one: ");
int ret = scanf("%c", &selection);
printf("Scanf I think failed. Return value is: %d. Selection is: %c (%d)n",
ret, selection, selection);
您可以从手册页中找到返回值的含义。在这种情况下,此处的返回代码将告诉您成功匹配和分配了多少项。您会在此处看到 1,因此您知道呼叫有效。您的输出将如下所示:
Scanf I think failed. Return value is: 1. Selection is:
(10)
这告诉你scanf
确实得到了一些东西,你没有看到打印的字符,但输出跳过了一行(可疑),打印的 ASCII 值是 1010,查找你会看到它是一个换行符。