为什么对scanf的调用是这样的?这是标准吗?

Kev*_*vin 2 c stdin input

我正在完成K&R练习7.4和7.5,并遇到了一个恼人的"功能",我不相信标准状态.

根据K&R,转换规范"%c"的作用方式

"下一个输入字符(默认为1)放置在指定的位置.正常跳过空白区域被抑制;要读取下一个非空格字符,请使用%1s"

我的问题是,该声明应该是这样的:

"接下来的输入字符(默认值为1)被放置在指定的位置.然后,在连续调用scanf中再次使用%c时,正常跳过空白区域被抑制;要读取下一个非空格字符,使用%1s"

...因为这段代码:

void test1()
{
   char t1, t2;

   scanf("%c %c", &t1, &t2);
   printf("%d\n", t1);
   printf("%d\n", t2);

   //INPUT is: "b d" (without quotes)
}
Run Code Online (Sandbox Code Playgroud)

得到t1 = 98(b)和t2 = 100(d).(跳过空白)

但是,这段代码:

void test2()
{
   char t1, t2;

   scanf("%c", &t1);
   scanf("%c", &t2);
   printf("%d\n", t1);
   printf("%d\n", t2);

   //INPUT is: "b d" (without quotes)
}
Run Code Online (Sandbox Code Playgroud)

得到t1 = 98(b)和t2 = 32('').(没有跳过空格)

阅读原始引用,我认为任何合理的人都会认为在同一次调用scanf(%c)期间,空格跳过被抑制.但是,情况似乎并非如此.

似乎为了获得原始功能,人们必须完全清空stdin.

这应该是这样的吗?它有记录吗?因为我环顾四周,并没有看到太多关于此的信息.

作为参考,我在C99编程.

Mic*_*bus 13

这是因为传递给scanf的字符串中的空格意味着空格跳过.如果您删除了空格而"%c%c"不是使用"%c %c",则第一个程序的行为与第二个程序完全相同.

所以你的问题的答案是:正常跳过总是被抑制,它只是做魔术的空间.