具有不同格式说明符的 scanf() 函数

scanf() function with different format specifier

下面是一个接受两个字符并打印它们的程序

#include<stdio.h>
int main()
{
    char c1, c2;
    printf("\n Enter characters one : ");
    scanf(" %c", &c1);
    printf("\n Enter character two : ");
    scanf("%c", &c2);
    printf("\n The the characters are %c and %c ", c1, c2);
    return 0;
}

现在一个输出实例是:-

Enter two characters : a
The the characters are a and

问题是我没有在两个格式说明符 %c 之间给出任何 space 在这里我按下 'a' 然后 '\n' 分别存储到 c1 和 c2 中。因此我得到了不被接受的输出。

我知道如何解决这个问题。

现在我为整数编写相同的程序:-

#include<stdio.h>
int main()
{
    int a, b;
    printf("\n Enter two numbers : ");
    scanf("%d%d", &a, &b);
    printf("\n The two numbers are %d and %d ", a, b);
    return 0;
}

这里我们不会发现任何问题。

我认为这次我们没有遇到问题,因为我们给出的第二个输入是 '\n' 或 space,这不是任何整数,因此我们无法从 scanf() 函数,因此输入缓冲区仍然处于活动状态,如果我们将下一个输入作为整数输入,那么它将存储到变量 'b'.

你能告诉我我认为正确与否的原因吗?

现在,如果它是正确的,那么如果我再按一个字符会发生什么。然后它也不应该存储到变量 'b' 但这次 0 存储到变量 'b'.

所以我的问题是,当我尝试用 %d

制作相同的程序时,程序正常运行的原因是什么

它正在读取新行,因为新行是一个字符。只需将 scanf("%c", &c2); 更改为 scanf(" %c", &c2); 即可。

所以在你的代码中: #include

int main()
{
    char c1, c2;
    printf("\n Enter characters one : ");
    scanf(" %c", &c1);
    printf("\n Enter character two : ");
    scanf(" %c", &c2);
    printf("\n The the characters are %c and %c ", c1, c2);
    return 0;
}

为了回答您的问题,让我们看一下 C11 标准,第 7.21.6.2 章

Input white-space characters (as specified by the isspace function) are skipped, unless the specification includes a [, c, or n specifier.

因此,当您在输入缓冲区中留下 newline'\n',这确实是一个 white-space 字符)时,

  • scanf("%c", &charVar); 的情况下,换行符被视为输入,因此第二个 scanf 跳过 要求用户输入。

  • scanf("%d", &intVar); 的情况下,剩余的 newline 跳过 并等待 整数 输入出现,所以它 停止并询问 用户输入。

但是,FWIW,在后一种情况下,如果您输入 non-whitespace 字符 并按 ENTERchar输入将被认为是输入,导致匹配失败。

相关

[...] If the input item is not a matching sequence, the execution of the directive fails: this condition is a matching failure.