scanf
以stdin的IO_FILE结构为基础,从标准输入中格式化地读取内容。
函数原型:实际调用的是 _IO_vfscanf
→ _IO_vfscanf_internal
,内容太长,将在后面讲解
// stdio-common/scanf.c, line #26
int
__scanf (const char *format, ...)
{
va_list arg;
int done;
va_start (arg, format);
done = _IO_vfscanf (stdin, format, arg, NULL);
va_end (arg);
return done;
}
ldbl_strong_alias (__scanf, scanf)
inchar
:读一个charungetc
:将一个char放回IO_FILE里面char_buffer
作为处理缓冲区:
inchar
一个一个读取字符,开头允许 +/-/0x
,接着若是 [0-9]/[A-F]
则放入缓冲区,且不会限制放入缓冲区的字符数量(无视实际整数类型,此处可能会导致分配堆空间),输入后转换超限制这直接设为-1(__strtoll_internal
行为,该函数不在glibc中(可能在linux内?))
__strtoull_internal/__strtoll_internal
转换会忽略前导空白字符,读取到空白字符就会停止(空白字符会被返还给IO_FILE),会添加\\0
不会忽略字符,行为如同getchar