c中scanf函数的格式说明符中%c规范之前的空格

c中scanf函数的格式说明符中%c规范之前的空格,c,character,scanf,format-specifiers,C,Character,Scanf,Format Specifiers,当我在以下程序中的scanf()函数的格式字符串中不包含%d和%c规范之间的空格,并且在运行时将输入设为“4h”时,则输出为“Integer=4,Character=” 在这种情况下,变量“c”的输入准确程度如何?如果在%d和%c规范之间包含空格,会有什么区别 代码 #包括 int main() { 字符c; int i; printf(“输入整数和字符:\n”); scanf(“%d%c”、&i和&c); printf(“整数=%d和字符=%c\n”,i,c); getch(); } sca

当我在以下程序中的
scanf()
函数的格式字符串中不包含
%d
%c
规范之间的空格,并且在运行时将输入设为“4h”时,则输出为“Integer=4,Character=”

在这种情况下,变量
“c”
的输入准确程度如何?如果在
%d
%c
规范之间包含空格,会有什么区别

代码

#包括
int main()
{
字符c;
int i;
printf(“输入整数和字符:\n”);
scanf(“%d%c”、&i和&c);
printf(“整数=%d和字符=%c\n”,i,c);
getch();
} 

scanf中
%c
说明符前面的空格指示它跳过任意数量的空格。换句话说,从标准输入读取,直到找到非空格字符或键盘中断为止。

如果仔细阅读规范,大多数格式说明符跳过前导空格。在Stan中dard C,有三个不符合要求:

  • %n
    -到目前为止已处理了多少个字符
  • %[…]
    -扫描集
  • %c
    -读取字符
(POSIX添加了第四个
%C
,相当于
%lc

除非转换规范包括
[
c
c
n
转换说明符,否则应跳过输入空格字符(如
isspace
所规定)

%d
%c
之间添加空格意味着在读取整数之后和(非空格)字符之前跳过可选的空格


请注意,格式字符串中的文字字符(除空格外-例如,
“X%dY”
中的
X
Y
)不会跳过空格。匹配此类字符也不会被视为成功转换;它们不会影响
scanf()的返回值
等。

这意味着,当我不使用%d和%c规范之间的空格时,当将输入作为“4h”时,编译器将分配“空格”"对于char变量“c”,我是否正确???@Shubhamdubey2111;是的。完全正确。此外,如果两个整数而不是一个字符和一个整数,则包含/排除空格不会影响程序。为什么?这仅适用于
%c
说明符?当然不会消耗前导空格,它适用于至少两个其他格式说明符另外,如果使用两个整数而不是一个字符和一个整数,则包含/排除空格不会影响程序。为什么???@Shubhamdubey2111答案在于“如果仔细阅读scanf()的规范,大多数格式说明符(如%d)都会跳过前导空格。在标准C中,有三种格式说明符不会:好的,现在我明白了。Thanks@petercordes我打开了它,因为我认为这是另一个我再次遇到的情况,即在一行中放置
%c
,没有前面的空格,因此“缓冲区中的换行符”毫无疑问所以它有些不同。@AnttiHaapala:我想我把它作为的副本关闭了,因为最终的问题是相同的:
%c
本身(与其他转换不同)如果这是下一个字符,将读取一个空格。但是格式字符串中的文本空格会占用任意数量的空白。不过,重新打开也可以;这里的答案很好。
#include <stdio.h>

int main()
{
    char c;
    int i;
    printf("Enter an Integer and a character:\n");
    scanf("%d %c",&i,&c);
    printf("Integer = %d and Character = %c\n",i,c);
    getch();
}