具有不同格式说明符的 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 字符 并按 ENTER,char输入将被认为是输入,导致匹配失败。
相关
[...] If
the input item is not a matching sequence, the execution of the directive fails: this
condition is a matching failure.
下面是一个接受两个字符并打印它们的程序
#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
, orn
specifier.
因此,当您在输入缓冲区中留下 newline
('\n'
,这确实是一个 white-space 字符)时,
在
scanf("%c", &charVar);
的情况下,换行符被视为输入,因此第二个 scanf 跳过 要求用户输入。在
scanf("%d", &intVar);
的情况下,剩余的newline
被 跳过 并等待 整数 输入出现,所以它 停止并询问 用户输入。
但是,FWIW,在后一种情况下,如果您输入 non-whitespace 字符 并按 ENTER,char输入将被认为是输入,导致匹配失败。
相关
[...] If the input item is not a matching sequence, the execution of the directive fails: this condition is a matching failure.