C语言 扫描函数的使用次数是否有限制



为了回到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,查找你会看到它是一个换行符。

最新更新