在例2.7中的语句
scanf ("%d%d%d" ,&a ,&b ,&c );
中,只要不在最后留有空格,都不影响数字输入。如果要按格式输入,可以在格式说明中给出,例如在语句
scanf ("%d%d%d" ,&a ,&b ,&c );
中,要求输入数据用“,”隔开。对于字符而言,语句
scanf ("%c%c%c" ,&c1 ,&c2 ,&c3 );
则要求三个字符之间不能用空格隔开,但对于语句
scanf ("%c %c %c" ,&c1 ,&c2 ,&c3 );
而言,既可以连续输入,也可以用空格隔开,即输入
abc
和使用空格隔离的输入
a b c (包括ab c 和a bc )
是等效的。最有意义的是:还可以用回车一个一个地输入,即
a b c
但是在一行输入时,第1个输入不能留空格,即“abc”将会得到输出“a,b”。
试想一想,下面的语句会出现何种现象?
scanf (" %c %c %c" ,&c1 ,&c2 ,&c3 );
这个语句非常有意义,它不仅能适应上述4种输入形式,还可以有第5种方式,即可以先按回车,然后再使用4种方式的任意一种输入。下面这个程序将体现它这个非常有用的特点。
【例2.8】分析下面的程序是否正确。
#include <stdio.h> void main () { char c1 ; for (;;){ printf (" 继续则输入Y :" ); scanf ("%c" ,&c1 ); if (c1 !='Y' ) break ; printf ("go on\n" ); } printf ("go out\n" ); }
【分析】程序语法没有错误,能通过编译,但运行结果有时正确有时错误,例如:
继续则输入Y : Y go on 继续则输入Y :go out
第2次询问,不等用户输入就错误地结束循环,输出go out。这就是这两条语句相遇碰到的问题,但利用空格就能解决,即改为
scanf (" %c" ,&c1 );
能得到正确的结果。运行示例如下。
继续则输入Y :Y go on 继续则输入Y :Y go on 继续则输入Y :a go out
由此可见,用空格能很好地解决这个问题。