2.6 字符输入要搞特殊化

在例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
  

由此可见,用空格能很好地解决这个问题。

《C语言解惑》