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)
  1. 主要调用的IO_FILE函数有:
  2. 有一个 char_buffer 作为处理缓冲区:

%d/%u/%x/%o/%i

  1. 这类标识符总会丢弃第一个非空白字符前的所有内容,且无论读取是否成功,都不会再将这些空白字符返还给IO_FILE
  2. 会利用 inchar 一个一个读取字符,开头允许 +/-/0x ,接着若是 [0-9]/[A-F] 则放入缓冲区,且不会限制放入缓冲区的字符数量(无视实际整数类型,此处可能会导致分配堆空间),输入后转换超限制这直接设为-1(__strtoll_internal行为,该函数不在glibc中(可能在linux内?))
  3. 单纯的+/-也是可接受的,同时会将其从缓冲区里取出,但不会实际写入数字到整形指针内

%s

会忽略前导空白字符,读取到空白字符就会停止(空白字符会被返还给IO_FILE),会添加\\0

%c

不会忽略字符,行为如同getchar