scanf函数的格式说明
(2013-01-09 08:14:28)
标签:
杂谈 |
分类: C |
格式说明字符串规定了输入项中的变量将以何种类型的数据格式(由转换说明符给出)被输入,格式控制字符串的一般形式:
其中修饰符为任选项。
1)格式转换说明符:用于指定相应输入项内容的输入格式,常用格式见下表1。
表1 scanf函数转换说明符
|
格式 |
意义 |
|
d |
输入一个十进制整数 |
|
o |
输入一个八进制整数 |
|
x |
输入一个十六进制整数 |
|
i |
输入一个有符号或无符号的十进制、八进制、十六进制整数 |
|
u |
输入一个无符号十进制整数 |
|
f 、e或E、 g或G |
输入一个小数形式或指数形式的浮点数 |
|
c |
输入一个字符 |
|
s |
输入一个字符串 |
例如:
它
有两个参数“%d”和&x,第一个参数是格式控制字符串,由%后接一个类型转换说明符构成,指出用户应该输入的数据类型,转换说明符%d说明输入
的数据应该是一个整数。第二个参数是变量x的地址,&与变量名连用是将变量x的内存地址告诉scanf函数,计算机然后就会将输入的数据存储在这
个地址单元中。
计算机在执行scanf语句时,等待用户输入变量x的值,用户通过键入一个整数并按下回车键响应请求,计算机把用户的输入值赋给变量x,操作完成后,对x的引用就会使用这个值。scanf函数(及后面学习的printf函数)提高了用户与计算机之间的交互性。
在 有多个输入项时,如果格式控制字符串中没有普通字符或转义字符作为读入数据之间的分隔符,则一般采用空格符、符或回车键作为读入数
据的分隔符,当C语言的编译系统空格符、符或回车键以及非法字符时,会自动认为数据输入结束。计算机等待所有的数据输入结束后的最
后一次<回车键>,将读入的数据分别付给对应的变量所指定的内存单元。如果数据的输入少于格式控制字符串中指定的转换说明符的个数,则计算机
将一直等待数据的输入,直到所有数据全部被键入为止。
例如:
读入数据的方式可以是:
或者
或者
采用“%d%d”形式的格式字时,不能使用其它的数据读入方式。例如:1,2<回车>,会使得只有1被送入x单元,而y单元不能够得到数据2。
但是,在输入多个带有字符型数据时,若以空格符作为分隔符,可能产生非预期的结果。此时,空格将被作为有效字符处理。
例如:
如
果数据读入方式为:123<空格>a<回车>,本意是期望变量a的值为数值32,变量ch的值为字符a,但实际上用于分隔数据的
空格被作为有效字符数据读入并赋予给字符变量ch。为了避免这种情况,可以在格式控制字符串中加入空格作为分隔符。将上面例句改为:scanf(“%d
%c”,&a,&ch);此处的%d后的空格,就可以跳过字符‘a’前所有的空格,从而保证非空格数据的正确录入。
2)修饰符
scanf函数的修饰符有:数据读入宽度(域宽)、*和长度。修饰符和意义见下表2。
表2 修饰符以及意义
|
标识符 |
意义 |
|
域宽 |
指定输入数据的宽度 |
|
* |
跳过相应数据不作处理 |
|
l或h |
读入长整型、双精度型或短整型数据 |
①域宽
可以用一个十进制数指定输入数据的数据宽度,系统自动按域宽截取输入数据。
例如:
表示按宽度3输入一个整数给变量a。如果读入数据为:123456<回车>,则变量a实际接收的值为123。
例如:
如果读入数据为:123456789<回车>,则变量a、b 、c 的值分别是12、345和6789。可以实现数据的自动截取。
②字符*
*表示按指定格式读入数据但不赋予相应的变量,作用是跳过相应的读入数据。
例如:
执行该语句,若输入为1? 2? 3<回车>,结果为a=1,b=3,c未赋值,2被跳过。
例1:一个实际问题——处理一个日期数据。
假设日期读入的格式为:
12-2-2003或12/02/2003,该数据格式中的年、月、日三个数据需要保存,但是连接年、月、日数据的连接符需要被废弃。
当用户以12-02-2003形式键入日期数据时,该数据中的每一个数值(年、月、日)需要被读入对应的变量year、month、date内存单元中,为了去掉不需要的将年、月、日数据分开的连接符,直接方法是将这些字符包含在scanf的格式控制串中。
例 如将语句写成:scanf(“%d─%d─%d’,&date,&month,&year);这条语句可以去掉以
12-2-2003形式读入数据中的连字符,但是当用户输入如下格式的日期数据::12/2/2003或12:2:2003时,该语句语句不仅不能去掉不
需要的字符(/或:),还会造成数据错误(只能正确得到date数据)。如果在输入格式字符串中使用scanf函数提供的*,将语句写成:
scanf(“%d%*c%d%*c%d’,&date,&month,&year);就能够从输入数据中读取有效数据并废弃任何%*c所指定的数据(不将其赋给某个变量)。
程序清单如下:
#include
main( )
{
}
运行结果:
③l和h
用于说明输入的数据时长整型(l)或短整型(h)。l和h可以和转换说明符d、o、x一起使用,形式为%ld、%lo、%lx、%hd、%ho、%hx,此外l还可以与f或e一起(%lf或%le)表示输入double型数据。
例如:
表示变量a的数据按宽度为10的长整型读入,而变量b的数据按短整型读入。
3)普通字符(非格式字符)
格式控制字符串中除了格式字与修饰符外,还可以包含普通字符,这些普通字符包括:可打印字符、空格和转义字符。
①可打印字符:对scanf函数,如果格式控制字符串中的说明符之间包含有其他字符,那么在输入数据时,必须在相应位置读入这些字符。
例如 :
若数据输入:1<空格>2;则只有变量a的数据是正确的,变量b则会发生错误。这是因为格式控制字符串中存在可打印字符“,”,所以在读入数据时,必须以“,”作为输入数据的分隔符。
正确地读入数据方式应为:1,2<回车>
又
如:scanf(“a=%d,b=%f,c=%c”,&a,&b,&c);当输入为:1,2,a时,虽然采用了“,”分隔数据,
但也会产生错误,因为在格式控制字符串中还有其他的可打印字符(如:“a=”,“b=”,“c=”等)。也就是说,这些字符作为输入数据的分隔符,在
scanf函数读入数据时自动去掉。因此正确地数据读入方式应为:a=1,b=2.1,c=a<回车>
②空格
格式控制字符串中的空格可以分隔数据,在多个数据输入过程中,如果没有普通字符做数据的分隔符,则在数值数据输入时,可以用空格作为读入数据的分隔符,但在字符数据输入时,空格则不能作为数据之间的分隔符,它将被作为有效数据处理。
③转义字符
在以%c格式的数据读入中,转义字符被作为有效字符处理。而在格式控制字符串中的转义字符具有输入转义字符所代表的控制代码或特殊字符的功能。
请分析下面程序代码:
main()
{
}
如果输入1 2,会发生什么现象?应该怎样读入数据,才能得到执行结果?
提示 |
尽量不要在scanf()函数的格式控制字符串中出现普通字符,特别是转义字符,它会增加读入数据的难度并可能造成不可预料的错误。 |

加载中…