下面是一个接受两个字符并打印它们的程序
#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
答案 0 :(得分:2)
要回答你的问题,让我们看看C11
标准,章节§7.21.6.2
除非是跳过输入的空白字符(由
isspace
函数指定) 该规范包括[
,c
或n
说明符。
所以,当你在输入缓冲区中留下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;
}