最近在学习C语言,早上起来写了个简单程序,但有个问题始终没解决,就到论坛里发了帖子,如下:
这是“棋盘上的距离”程序代码。
样例输入
2
a1 c3
f5 f8
样例输出
2 1 2 1
3 1 1 Inf
但是上述代码第二行输出为:89 2 2 Inf
如果只是单次循环,则都正确...
请问问题出在哪呢?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
有位网友的解释非常清楚:
scanf()函数在用"%c"输入时,空格和“转义字符”均作为有效字符。
例:
scanf("%c%c%c",&c1,&c2,&c3);
输入:a□b□c↙
结果:a→c1,□→c2,b→c3 (其余被丢弃)
而使用scanf时,每一次输入以回车结束,然后连同回车符一起送往输入缓冲区,遵循先进先出的原则,因此如果缓冲区内还存有之前未被处理的数据,之前的数据先处理,刚送到的压后,包括回车符。
输入最后的enter的确影响到了下次数据的输入。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
那么解决问题的方法就是消除缓冲区中多余的回车符的影响,具体有三种:
在scanf("%c%d %c%d",&SXaxis,&SYaxis, &DXaxis,&DYaxis);语句前 添加getchar();或while(getchar()!='/n')continue;或fflush(stdin);
当然实质上就是两种,getchar();和fflush(stdin);
有网友说在scanf("%c%d %c%d",&SXaxis,&SYaxis, &DXaxis,&DYaxis);语句后 添 加,在这个程序中确实可以,因为在scanf("%d/n", &total);中已经添加了/n,但这样并不规范,如果写成scanf("%d", &total);则必须在scanf("%c%d %c%d",&SXaxis,&SYaxis, &DXaxis,&DYaxis);前 添加getchar();或while(getchar()!='/n')continue;或fflush(stdin);来同时消除两句scanf语句扫描多余回车符带来的影响。
非常感谢广大网友!
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
对比书上的程序样例:
发现其实我写的程序中bishop函数的算法是有问题的...没有考虑V字形的走法...唉...