一个简单C程序引发的讨论

最近在学习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字形的走法...唉...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值