具有变长参数表的函数 scanf 的声明形式如下:
int scanf(char *format, ...)
scanf 函数从标准输入中读取字符序列,按照 format 中的格式说明对字符序列进行解释,并把结果保存到其余的参数中:
- 除了格式参数 format 之外的其它所有参数都必须是指针,用于指定经格式转换后的相应输入保存的位置。
- 当 scanf 函数扫描完其格式串,或者碰到某些输入无法与格式控制说明匹配的情况时,该函数将终止,同时,成功匹配并赋值的输入项的个数将作为函数值返回,所以,该函数的返回值可以用来确定已匹配的输入项的个数。
- 如果到达文件的结尾,该函数将返回 EOF。注意,返回 EOF 与 0 是不同的,0 表示下一个输入字符与格式串中的第一个格式说明不匹配。
- 下一次调用 scanf 函数将从上一次转换的最后一个字符的下一个字符开始继续搜索。
格式串**(format)**通常都包含转换说明,用于控制输入的转换。格式串可能包含下列部分:
- 空格或制表符,在处理过程中将被忽略。
- 普通字符(不包括%),用于匹配输入流中下一个非空白符字符。
- 转换说明,依次由一个 % 、一个 可选的赋值禁止字符* 、一个可选的数值(指定最大字段宽度)、一个可选的 h、l 或 L 字符(指定目标对象的宽度)以及一个转换字符组成。
转换说明控制下一个输入字段的转换。一般来说,转换结果存放在相应的参数指向的变量中。但是,如果转换说明中有赋值禁止字符 *,则跳过该输入字段,不进行赋值。输入字段定义为一个不包括空白符的字符串,其边界定义为到下一个空白符或达到指定的字段宽度。
这表明 scanf 函数将越过行边界读取输入,因为换行符也是空白符。(空白符包括空格符、横向制表符、换行符、回车符、纵向制表符以及换页符)。
转换字符指定对输入字段的解释。对应的参数必须是指针,这也是 C 语言通过值调用语义所要求的,下表列出了这些转换字符。
转换说明 d、i、o、u 及 x 的前面可以加上字符 h 或 l:
- 前缀 h 表明参数表的相应参数是一个指向 short 类型而非 int 类型的指针。
- 前缀 l 表明参数表的相应参数是一个指向 long 类型的指针。
- 转换说明 e、f 和 g 的前面也可以加上前缀 l,它表明参数表的相应参数是一个指向 double 类型而非 float 类型的指针。
另外还有一个输入函数 sscanf,它用于从一个字符串(而不是标准输入)中读取字符序列:
int sscanf(char *string, char *format, arg1, arg2, ...)
它按照格式参数 format 中规定的格式扫描字符串 string,并把结果分别保存到 arg1、arg2、…这些参数中。这些参数必须是指针。