在scanf.c文件中,可以看到scanf函数,代码如下:
对于va_list、va_start、va_end等在stdarg.h头文件中定义的宏,都已经在(stdarg.h头文件源代码分析)一文中介绍过。在上述代码中我们可以看到有一个_doscan函数,而这一函数在头文件loc_incl.h中定义,函数声明如下:
在上面的源代码中,值得注意的是第26行的getc宏,定义代码如下:
#define getc(p) (--(p)->_count >= 0 ? (int) (*(p)->_ptr++) : \ __fillbuf(p))getc的调用形式:ch=getc(fp); 功能是从文件指针指向的文件读入一个字符,并把它作为函数值返回给int型变量ch。
第4行~第17行,定义一些后面需要用到的变量
第23行~第34行,跳过format格式串中的空格,并且跳过输入流中的空格
第37行~第42行,输入流stream与format格式串中的空白符(空白符可以是空格(space)、制表符(tab)和新行符(newline))保持一致
第44行~第52行,在format中的字符为'%'的前提下,stream中的字符也为'%',则继续
第54行~第57行,format当前字符为'*',表示读指定类型的数据但不保存
第58行~第62行,指定说明最大域宽。 在百分号(%)与格式码之间的整数用于限制从对应域读入的最大字符数于宽度
第64行~第282行,switch语句,用于格式修饰符,这些修饰符包括: h、l、L、c、p、b、d、i、o、u……,还有基于扫描集的'['修饰符
对scanf函数的源码分析,需要在scanf函数的语法格式详细的理解基础上进行,由于scanf函数实现十分复杂,需要仔细的品味,这里只是比较初步的分析,具体还有待后期不断的完善
xiniuniu 发表于 2015-4-9 09:55
_doscan函数的实现源代码如下:在上面的源代码中,值得注意的是第26行的getc宏,定义代码如下:#define ...
xiniuniu 发表于 2015-4-9 09:55
_doscan函数的实现源代码如下:在上面的源代码中,值得注意的是第26行的getc宏,定义代码如下:#define ...
綦敦涛 发表于 2015-4-9 19:19
因为你scanf的格式控制符是%d,所以尽管你输入的时0.5,实际存入n的值是0,这样n
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |