黑马之王 - 2003-1-5 12:55:00
在程序员后面的皇后问题源程序中有这样一段代码
要注意我加上去的注释部分
.
.
.
.
if(k==n)/*找到一个解*/
{
printf("列\t行);
for(i=1;j<=n;j++)
printf("%3d\t%d\n",j,col[j]);
printf("enter a character(Q/q for exit)!\n");
scanf(" %c",&awn);/*注意这里scanf中的空格*/
if(awn==`Q`||awn==`q`)exit(0);
}
.
.
.
想必大家才都能知道这段代码的功能,也就是说如果用户没有输入退出的条件(q或者Q)那么程序会将下一个皇后解都打出来知道出现Q/q或者全部解输出完为止,问题就出在这里,scanf里面为什么要有一个空格呢?如果没有运行会是:当输入非退出条件会连续输出两个解,这是为什么?原因就在scanf。
空格在scanf函数中是一个参数,我们都知道c语言的输入输出流有三种(stdio,stdin,stderr)scanf函数是在键盘缓冲区取数据,当我们输入的数据在屏幕上显示的时候,实际上数据还在键盘缓冲区,当用户输入回车键的时候计算机会把缓冲区的数据(包括回车)输入到内存供程序的执行。而参数%c是接受字符的,当他遇到回车scanf也能正常接收。
假设现在scanf没有空格
分析:现在我们再来看看我们的程序:假设现在输入y继续执行程序函数scanf正确接收到了y,循环继续,但是下一个字符应该是回车,scanf函数循环接收到的回车!=q/Q,这样循环又继续一次此时没有数据,那么计算机就等待用户输入数据。就这样用户输入一个数据就会出现两次,这是我们程序员不希望看到的。
解决:解决就是在%c的前面加上一个空格,空格是一个参数,它可以在scanf接收数据之前屏蔽回车(\0),这样就能达到我们的预想效果。
或许你认为这个问题不严重,但是如果出现在银行,那就惨了。
下面你做一个题目(很简单)
题目:模拟银行的零币兑换系统:每一次用户只能取0.5元,然后提示用户:是否继续取款(y/n)?输入y+确认(可以用计算机的回车代替)计算机就再给用户0.5元,输入n会退出零币兑换。
如果你设计不好用户输入一个y+确认,你就输出2张零币,那银行可要破产了。
如果你有兴趣可以把书上的皇后问题源程序运行一次,分别看看scanf在没有空格的条件下的运行结果你就明白了
该被帖于【2003-1-5 13:02:50】被【黑马之王】修改
该被帖于【2003-1-5 13:23:34】被【黑马之王】修改
该被帖于【2003-1-5 14:36:38】被【黑马之王】修改
周鹏10 - 2005-3-30 17:44:00
很经典啊~原来我就碰到过这个问题~,我考虑了很久,老是检查不出什么毛病,今天终于知道为什么!谢谢啊
© 2000 - 2024 Rising Corp. Ltd.