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

时间:2015-12-30 20:02:17

标签: c scanf format-specifiers

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

#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之间给出任何空格 在这里,我按下了一个&#39;然后&#39; \ n&#39;它分别存储在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'或空格,这不是任何整数,因此我们从scanf()读取失败函数使输入缓冲区仍处于活动状态,如果我们将下一个输入作为整数,则将其存储到变量'b'中。

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

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

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

创建相同的程序时,该程序的正确行为是什么原因?

2 个答案:

答案 0 :(得分:2)

要回答你的问题,让我们看看C11标准,章节§7.21.6.2

  

除非是跳过输入的空白​​字符(由isspace函数指定)   该规范包括[cn说明符。

所以,当你在输入缓冲区中留下newline'\n',确实是一个空白字符)时,

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

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

但是,FWIW,在后一种情况下,如果您输入非空白字符并按 ENTER ,则会考虑 char 输入作为输入,导致匹配失败。

相关

  

[...]如果   输入项不是匹配的序列,指令的执行失败:这   条件是匹配失败。

答案 1 :(得分:0)

它正在读取新行,因为换行符是一个字符。只需将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;
}