我正在完成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",则第一个程序的行为与第二个程序完全相同.
所以你的问题的答案是:正常跳过总是被抑制,它只是做魔术的空间.