scanf函数的源代码

发布网友

我来回答

1个回答

热心网友

int
__cdecl
scanf
(
const
char
*format,
...
){
va_list
arglist;
va_start(arglist,
format);
return
vscanf(_input_l,
format,
NULL,
arglist);}int
__cdecl
vscanf
(
INPUTFN
inputfn,
const
char
*format,
_locale_t
plocinfo,
va_list
arglist
)/*
*
stdin
'SCAN',
'F'ormatted
*/{
int
retval;
_VALIDATE_RETURN(
(format
!=
NULL),
EINVAL,
EOF);
_lock_str2(0,
stdin);
__try
{
retval
=
(inputfn(stdin,
format,
plocinfo,
arglist));
}
__finally
{
_unlock_str2(0,
stdin);
}
return(retval);}int
__cdecl
_input_l(_Inout_
FILE
*
_File,
_In_z_
__format_string
const
unsigned
char
*,
_In_opt_
_locale_t
_Locale,
va_list
_ArgList);由上面代码可知scanf
只不过是一张皮,scanf
一个族系的函数都是通过实际调用
vscanf
来实现功能的,而vscanf
又是通过调用
_input_l
函数来实现功能的。
我们知道windows
的IO
是通过文件技术实现的,不管是输入设备还是输出设备,操作系统都将它抽象成一个文件,通过对文件的读写实现对数据的输入和输出。
通过查询stdin的定义:
#define
stdin
(&__iob_func()[0])
_CRTIMP
FILE
*
__cdecl
__iob_func(void);
我们可以知道,_input_l
函数正是将键盘输入写入了stdin
创建一个临时的交换文件的缓冲区的。
说道读取文件,你上面的问题就好揭示了。
第一、"1000
50
^z"
是一个整体,是一个有效的字符串,其本身并不含有文件结尾的含义。因为你不能说“这个人不讲礼貌,分手了也不说再见”,这句话和“再见”
这个词的含义是一样的。
第二、单独的^Z
可被认作文件的结尾也就是你判断条件中的EOF。
因此,单独输入^Z
是可以结束循环的。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com