scanf() 与 printf() 类似,也是用格式字符串和参数列表。scanf() 中的格式字符串表明字符输入流的目标数据类型。两个函数主要的区别在参数列表中。printf() 函数使用变量、常量和表达式,而 scanf() 函数使用指向变量的指针。这里你不必了解如何使用指针,只需记住以下两条简单的规则:

  • 如果用 scanf() 读取基本变量类型的值,在变量名前加上一个 &;
  • 如果用 scanf() 把字符串读入字符数组中,不要使用&。

表1 ANSI C 中 scanf() 的转换说明

转换说明含义
%c把输入解释成字符
%d把输入解释成有符号十进制整数
%e、%f、%g、%a把输入解释成浮点数(C99 标准新增了 %a)
%E、%F、%G、%A把输入解释成浮点数(C99 标准新增了 %A)
%i把输入解释成有符号十进制整数
%o把输入解释成有符号八进制整数
%p把输入解释成指针(地址)
%s把输入解释成字符串。从第1个非空白字符开始,到下一个空白字符之前的所有字符都是输入
%u把输入解释成无符号十进制整数
%x、%X把输入解释成有符号十六进制整数

表2 scanf()转换说明中的修饰符

转换说明含义
*抑制赋值:见文末附注1
示例:"%*d"
数字最大字段宽度。输入达到最大字段宽度处,或第1次遇到空白字符时停止
示例:"%10s"
hh把整数作为 signed char 或 unsigned char 类型读取
示例:"%hhd"、"%hhu"
ll把整数作为 long long 或 unsigned long long 类型读取(C99)
示例:"%lld"、"%llu"
h、l或L"%hd"和"%hi"表明把对应的值存储为 short int 类型
"%ho"、"%hx"和"%hu"表明把对应的值存储为 unsigned short int 类型
"%ld"和"%li"表示把对应的值存储为 long 类型
"%lo"、"%lx"和"%lu"表明把对应的值存储为 unsigned long 类型
"%le"、"%lf"和"%lg"表明把对应的值存储为 double 类型
在e、f和g前面使用L而不是l,表明把对应的值存储为 long double 类型。如果没有修饰符,d、i、o和x表明对应的值被存储为 int 类型,f和g表明把对应的值存储为 float 类型
j在整形转换说明后面时,表明使用 intmax_t 或 uintmax_t 类型(C99)
示例:"%jd"、"%ju"
z在整形转换说明后面时,表明使用 sizeof 的返回类型(C99)
示例:"%zd"、"%zo"
t在整形转换说明后面时,表明使用表示两个指针差值的类型(C99)
示例:"%td"、"%tx"

使用转换说明比较复杂,而且这些表中还省略了一些特性。省略的主要特性是,从高度格式化源中读取选定数据,如穿孔卡或其他数据记录。


附注:

  • scanf() 中将*放在%和转换字符之间时,会使得 scanf() 跳过相应的输入项,如下代码↓

    scanf("%*d %d", &a);

上述代码在执行中会跳过1个整数,把第二个整数拷贝给a。



最后修改:2021 年 10 月 11 日 11 : 24 PM
如果觉得我的文章对你有用,请随意赞赏