LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1571|回复: 15

scanf的疑问

[复制链接]
发表于 2005-1-1 22:09:33 | 显示全部楼层 |阅读模式
我在《实用c语言编程》这本书中看到这样一句话
  1. 函数scanf工作原理和printf相似,但scanf只读取数字, 不写数字。 它提供了一种简单容易的读取方式,[color=DarkRed] 但因为它对结束行处理的不好,对专业人员来说几乎没用。[/color]
  2. 于是, 人们很快找到了一种弥补scanf缺陷的简单方法--不单独使用它。 取而代之的是, 用fgets读取输入行并用sscanf把文本转换成数字类型
复制代码

小弟驽钝, 一直搞不懂scanf和fgets+sscanf到底有什么不同
哪位大虾能为我解释一下
thx
发表于 2005-1-2 10:31:56 | 显示全部楼层
最好的办法是自己针对这个问题写两个小程序。能写出来,自然就理解了。你先试试吧,有错再贴出来讨论。
 楼主| 发表于 2005-1-2 15:34:59 | 显示全部楼层
我没看出是么区别来啊
这是我编的程序

  1. //s.c
  2. #include <stdio.h>

  3. int main()
  4. {
  5.   char line[100];
  6.   int v1,v2;
  7. #ifdef S
  8.   scanf("%d%d", &v1, &v2);
  9.   printf("%d\t%d\n",v1,v2);
  10. #else
  11.   fgets(line, sizeof(line), stdin);
  12.   sscanf(line, "%d%d", &v1, &v2);
  13.   printf("%d\t%d\n",v1,v2);
  14. #endif
  15.   return 0;
  16. }
复制代码

这是结果
  1. [leo@leo test]$ gcc s.c -DS        [color=Magenta]编译scanf#[/color]
  2. [leo@leo test]$ ./a.out
  3. 1 2
  4. 1       2
  5. [leo@leo test]$ gcc s.c      [color=Magenta]#编译fgets+sscanf[/color]
  6. [leo@leo test]$ ./a.out
  7. 1 2
  8. 1       2
  9. [leo@leo test]$
复制代码

都挺正常的嘛
发表于 2005-1-2 15:40:24 | 显示全部楼层
会用就行了。两个函数的主要差别在于输入的来源不同,一个是从标准输入,一个是从字符缓冲。这就是最大的差别。
 楼主| 发表于 2005-1-2 20:39:34 | 显示全部楼层
按照书上的观点, 区别不仅于此吧
发表于 2005-1-2 21:53:41 | 显示全部楼层
Post by nait
按照书上的观点, 区别不仅于此吧

你所理解的区别肯定是受到了这本书的影响,不妨把书上的内容抄上来看看。不然,你我的理解不一致,不好交流。
 楼主| 发表于 2005-1-2 22:15:05 | 显示全部楼层
书上关于scanf和fgets+sscanf区别就我在上面引用的那么多
没有作额外的说明, 所以我是知其然而不知所以然
才来这儿问的呀
发表于 2005-1-2 22:28:53 | 显示全部楼层
那你所谓的区别范围也太大了吧,能不能具体点?
 楼主| 发表于 2005-1-2 22:31:26 | 显示全部楼层
我上面引用的那段文字不是说的很清楚了
scanf但因为它对结束行处理的不好,对专业人员来说几乎没用
我就是不理解这句话
发表于 2005-1-2 22:45:04 | 显示全部楼层
“结束行”是什么意思,我也不太理解这个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表