对于学C的人而言,scanf()你应该不会陌生,它至少是你最常用的几个scanf()之一.但是,你是否就认为很容易呢,对于初学者而言,你可能经常在这上面犯些你自已无法发现的小错误,请先看看下面的这个程序,如果你能解决这个问题的话,那么这篇文章对你可能就没有多大的价值了,应该说,这是一篇与初学者分享的文章. (为了讨论的方便,下面这段程序输入数据时按递增的方式进行,毕竟,这不是本文的重点)
#include "stdio.h"
main() { int a,i,first,end,mid; int flag=0; int data[10]; printf("Please input 10 numbers:\n"); for(i=0;i<=9;i++) scanf("%d",&data[i]); printf("\n"); scanf("Please input a number you want to find in 10 numbers:%d",&a); printf("\n"); first=0; end=9; mid=(first+end)/2; while(first<=end) { mid=(first+end)/2; if(data[mid]>a) end=mid-1; else if(data[mid]<a) first=mid+1; else { flag=1; break; } } if(flag) printf("The number you find is%d\n",data[mid]); else printf("don't find the number!\n"); getch(); }
首先,我们来看scanf()的格式: scanf(格式控制,地址列表); 作为最简单的情况是格式控制中只包含格式说明而没有其他字符,例如"%d%d".对于这种形式,我想你知道如何去处理.在输入的时候两个数据之间以一个或多个空格间隔,也可用回车,tab跳格键.需要提醒的是:这只是对于输入整数(即int)形式.如果是像 scanf("%c%c",&a,&b); 这样的话,你应该不会用空格什么的去间隔字符,事实上这是不必要的,它只会给带来麻烦,相反地,我们甚至必须考虑怎样去消除意外的错误.简单地说,你必须记住现在的空格,回车都成了一个字符,你可以通过下面这段程序来验证一下:
#include <stdio.h> main() { int a,b; char c,d; scanf("%d%d",&a,&b); printf("%d %d\n",a,b); scanf("%c%c",&c,&d); printf("%c %c\n",c,d); } 如果你输入的是 1(空格)3(回车) a(空格)b(回车) 那么,程序运行的结果会是什么呢?你可以自已运行试试.结果是 1(空格)3(回车) 1 3 a(空格)b(回车) (空行) a (!!!!表达可能不太准确,你自已运行这段程序可能会帮助你弄明白我在说些什么!!!)
为什么会是这样的呢.那是因为,在第一次输入数据的回车换行符和变量b的类型不一样,不能赋给变量b,至使其保留在键盘缓冲区,这样,当第二个scanf()执行时,便把回车换行符作为第一个字符读取到了c中,如果你在TC中用调试器观察一下c的值,会发现此时c='\n',而不是你想要的得到的c='a'!! 如何解决这个问题,你可以修改程序,在第二个scanf()之前加上一个 getchar(); 它会帮你吸收掉键盘缓冲区间的'\n',如果你不想改变源程序的话,你的输入必须像下面这样 1(空格)3ab 一次将数据全部输入到键盘缓冲区,接下来读取数据的过程就交给scanf()函数了,当然,这样的过程 是比较难以理解的,所以,我的建议是尽量不要scanf()来输入字符,而是利用另外一个函数getch(); 相对于 scanf("%c%c",&a,&b); 而言 a=getch();b=getch(); 这样的语句更能让你知道明白自已在干些什么!
OK.接下来的问题似乎变得有点容易了,如果你理解了上面的内容的话.我们来看看在格式控制中还有其他字符的情况: scanf("%d,%d",&a,&b); scanf("This is %d",&a); 单独地考虑上面的两条语句,你肯定知道如何去处理,那么我们复杂一点,将这两条语句放到一起.请看下面的程序:
main() { int a,b,c; scanf("%d%d",&a,&b); scanf("This is %d",&c); printf("a=%d,b=%d,c=%d",a,b,c); getch(); } 对照上一个程序,我想你可能已经知道如何处理了,可以在你的TC上验证一下你的想法,正确的输入方式是: 15(空格或回车)25This is 35 这样的话,程序运行的如果将是: a=15,b=25,c=35 不要企图用其他的方式得到上面这个输出结果,除非你的输入方式跟上面的一样!既然这样,那就让我们来讨论一下诸如 scanf("This is %d",&c); 这样的输入方式,在输入时,格式控制中的字符是必须严格地配对的,你必须保证在你输入This is 35时This前没有空格,回车等其他的字符,严格地说,你必须保证在执行这条语句时键盘缓冲区没有字符.这也是为什么上例中25和This这间不能有空格(否则地话,第二个scanf()将无法成功地为c赋值,c的值将是在定义的时候随机产生的一个值,这个值直接地决定于所分配的内存中原来保存的数值),你可以通过尝试其他的输入方式来看看会出现什么样的结果!!
好了,到此为止,我想你应该已经明白了我在说些什么了,可能你会想,这是多么简单的东西啊,如果这样的话,那么我要祝贺你了,写这篇文章,只是为了能给初学者起个抛转引玉的作用,作为经验与大家分享.不对的地方请高手指点...........
最后,就让我们再来看看开始的程序吧,你一定已经知道答案了!问题就出来第二个scanf()上,准确地说,这段代码并没有错,但是却会让你不经意地犯下错误.如果将 scanf("Please input a number you want to find in 10 numbers:%d",&a); 分成两个语句: printf("Please input a number you want to find in 10 numbers:"); scanf("%d",&a); 就能更好地理解了.否则,你的输入应该像下面这样: 1 2 3 4 5 6 7 8 9 10Please input a number you want to find in 10 number:2
[此贴子已经被作者于2004-09-09 13:06:43编辑过]