3.2.2 格式输入函数scanf()

一般的程序都需要输入数据。和输出函数printf()对应,scanf()函数可实现数据的输入。

扫一扫 看视频

先看下面的例子:

【例3.4】由键盘输入两个数再输出。

程序代码如下:

程序的运行结果为:

请输入两个整数:3 4<回车>

a=3  b=4

用scanf()函数输入数据的格式和printf()函数类似。C语言默认空格是输入数据之间的分隔符,输入数据后按【Enter】键则表示输入结束。空格、跳格符、换行符都是C语言认定的数据分隔符。C语言允许在输入数据时使用用户自己指定的字符(必须是非格式字符)来分隔数据。这时应在格式控制中的相应位置上出现这些字符。例如,scanf("%d,%d",&a,&b);,则应输入3,4,即以逗号分隔3和4。

相关知识3

格式输入函数的一般形式如下:

scanf(格式控制,地址项列表);

该函数从标准输入设备上读入字符序列,并将它们按指定格式进行转换后,存储于地址项所指定的对应的变量中。其中,格式控制可以是下列两种形式的组合:

①格式说明:同printf()函数有相似之处,也有不同之处。请参考printf()函数。

scanf()函数提供的格式字符基本组成如下:

注意:抑制字符*的作用是在按格式说明读入数据后不送给任何变量,即“虚读”。例如,scanf("%3d%*4d%f",&a,&b);,若输入为123456789.23,则a=123,b=89.23。在利用已有的一批数据时,若有一两个数据不需要,可以用此法“跳过”这些无用数据。

扫一扫 看视频

②输入数据的分隔符。

【例3.5】多种类型数据的输入。

程序代码如下:

程序的运行结果为:

12;36.89<回车>

a=12,b=36.889999  /*浮点型数据在内存中存储会有细微的误差*/

说明:输入数据格式控制规定以“;”分隔,则输入数据时应一致,也以“;”分隔。

扫一扫 看视频

【例3.6】按格式控制中指定的域宽截取输入数据。

程序代码如下:

程序的运行结果为:

12345678987654321<回车>

a=12,b=345.000000,c=6789.000000

说明:由于%2d只要求读入2个数字字符,因此把12读入送给变量a;%3f要求读入3个字符,可以是数字、正负号或小数点,把345读入送给b;又按%4f截取四位数6789,送给c。

思考:以下语句的输入方式是什么?

scanf("a=%d,b=%f,c=%f",&a,&b,&c);

提示:输入的数据应该为:a=12,b=345,c=6789.8<回车>。

注意:以上操作说明,如果在scanf()函数的格式控制符之间插入了其他字符作为数据之间的分隔符,则输入数据时要原样输入这些分隔符,否则将产生输入错误。为了减少输入错误,建议在输入语句前给出相应的printf语句增加输入数据的提示。如上面的思考题就可以在scanf语句前加入语句:printf("请输入数据:a=,b=,c=");作为输入格式的提示,明确数据输入时的格式,以保证数据的正确读入。

警告:输入数据时,不能企图规定精度。例如,scanf("%7.2f",&a);,这样做是不合法的,输入数据时不能规定精度。

③地址项列表:地址项列表是由若干等待输入的内存单元地址组成的,地址项之间用逗号分隔。该地址可以是变量的地址或字符串的地址等,其作用是存放输入的数据。C语言中变量地址的表示是在变量前加前缀符号“&”。

注意:在用scanf()函数输入数据时,后面的是地址表列,表示变量地址的前缀符号“&”不能丢掉。如果丢掉,程序也可以正常编译、执行,但输入的数据没有存到希望的变量中,导致最终结果错误。这是初学者容易犯的错误,应引起注意。