2.5 回车键打乱scanf的阵脚

【例2.7】假设有如下程序。


#include <stdio.h>
void main
()
{
     char c1
,c2
,c3
;
     int a
,b
,c
;
     scanf
("%d%d%d"
,&a
,&b
,&c
);
     scanf
("%c%c%c"
,&c1
,&c2
,&c3
);
     printf
("%d
,%d
,%d"
,a
,b
,c
);
     printf
("%c
,%c
,%c"
,c1
,c2
,c3
);
}
  

当程序运行时,使用如下输入方式:


12 34 56
abc
  

将得到什么输出结果?

【分析】有人可能认为就是按照输入的样子输出两行信息,其实不然。第1行输入时,给变量a、b和c赋值。当回车时,这个回车被作为字符赋给变量c1,后面的字符ab分别赋给变量c2和c3,而输入的c变成多余的了。c1里是回车符,所以程序输出为


12
,34
,56
,a
,b
  

如果输入“12 34 56abc”,则输出“12,34,56a,b,c”。这等效于如下输入方式:


12 34
56abc
  

由此可见,为scanf语句赋值时,也要具体问题具体分析,避免乱用回车键。

《C语言解惑》