回复 47楼 lz1091914999
对,从文件、内存中读入固定格式的数据,scanf()类函数(那是一个系列版本的函数,有专门读内存的,有专门读文件的,甚至Borland C有专门读屏幕的)能用,但这些都没有人的干预,只有人的动作是无法预料的,从控制台(std)交互读入数据,就要尽量避免用这个函数,因为你无法预料读到什么格式的数据,极有可能转换不到希望得到的数据类型上。
scanf()函数的机制,是从控制台读入一个字符串(注意,是字符串),然后对这个字符串进行分析,按照预定的format格式提取数据。比如,在1楼的程序代码里,期望是%d,%d,那么scanf()在取得第一个整数之后,就不断地寻找逗号,但事实上找不到,已经到达字符串的尽头了,但它还会找,把储存这个字符串的内存后面的东西提出来,这就是那些不可预料的数据,在某些机器上,是负值(至少我和楼主的机器是得到了负数,但其实应是随机的)。这就是这种后果的原因,也是scanf()类函数不管读什么数据,都是从指针(就是那个&符号)上取得数据的原因。
因为我知道(其实很多专门写C的人都知道)scanf()这种读取数据的机制,所以对无法预料格式的数据输入,是绝对避免使用scanf()函数的。必须用读字符串的方法,读进来,再自己分析,该怎么处理自己可以控制,但scanf()是库函数,其动作不是你可以控制的。以前我们专门比较过,只要一使用scanf()、printf()函数,程序的EXE代码就暴涨,可见它里面有多么复杂。我们不用这个东西,除了它有太多不需要用到的功能之外,还为了尽量减省内存。
对1楼这样的程序,良好的设计方式是把两个数据分开来读,一次只读一个数据,就不会出现这样的问题。还有一种办法是限制数据的位数,比如用%02d%02d之类。不过,在程序的界面,都应该向使用者提示推荐的输入格式,否则他不知道应该输入逗号,只有你写程序的才知道。写程序,要站在使用者的角度去看待问题,不是你自己知道内部运作去迁就程序的,真正的使用者,才不会管你这些东西。应用软件的程序设计,有八成功夫花在界面上,这是学写程序的人一定要注意的。
[
本帖最后由 TonyDeng 于 2011-7-31 22:11 编辑 ]