购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3-2 scanf( )函数

scanf( )函数和printf( )函数相类似,不过它主要是用来做数据输入。和printf( )函数一样,我们也可以将它的参数区分成两部分,一部分是控制输入格式区,另一部分是输入变量区,如下所示。

在使用上述scanf( )函数读取数据时,必须注意下列几点:

(1)第一个格式符号配合第一个欲输入的变量,其他以此类推。

(2)控制输入格式区需用双引号括起来。

(3)控制输入格式区和变量区之间用逗号分开。

(4)输入变量前面要加“&”符号,这是一个地址符号,数据读入时,C语言会将所读入的值,放在这个地址内。截至目前,读者只要知道在变量前面加上“&”符号就可以了,“&”符号代表变量的地址,至于有关“&”符号的细节,我们将在第11章做详细说明。

(5)当有输入多笔数据时,可以用空格或是逗号隔开。

(6)scanf( )函数所能读取的数据种类和printf( )函数所能打印的数据种类相同。

(7)读取字符串变量时,不必在字符串变量前面加上“&”符号,详细情形将在第8章进行说明。

下面是控制输入格式符号和输入数据形态的对照。

如果是要读取双倍精度浮点数变量,控制输入格式区必须使用%lf,使用%f会有不可预期的错误产生。

3-2-1 读取数值数据

读取数值数据又可以分为读取不同格式的数值数据、单笔数值数据和读取多笔数值数据。另外,读者也要了解读取不同格式的数值数据,笔者在本节将详细解说。

程序实例 ch3_16.c:读取八进制、十进制与十六进制的数值数据实例。

对于读者而言,比较特殊的是第11行使用%o格式符号读取八进制数据,和第13行使用%x格式符号读取十六进制数据。

程序实例 ch3_17.c:使用%f和%e分别读取浮点数与科学记号数值。

从上述可知道,读取浮点数时即使所输入数据是整数,例如上述左边的输入5,输入后也会被视为浮点数。另外,在输入科学记数值时,输入e或是E皆是可以被接受的。

格式符号%e虽是读取科学记数值,如果输出浮点数,C语言编译程序也会接受,不过不建议如此。如果将第13行的输出格式符号%e改为%E,则输出的科学记号e将被改为E。

程序实例 ch3_17_1.c:将输出格式符号%e改为%E,重新设计程序实例ch3_17.c。

上述程序实例第11行scanf( )读取数字是使用科学记数浮点数%e,笔者使用一般浮点数输入,C语言编译程序也会接受。

在使用scanf( )函数读取多笔数值数据时,控制输入格式区可以用空格或是逗号将格式符号隔开,这时在输入时可以用空格(可以按空格键或是Tab键产生空格)或是换行(按Enter键可以产生换行)输入。

程序实例 ch3_18.c:用scanf( )函数读取两笔数值数据的应用,两个格式符号是用空格隔开,读者可以参考程序实例第9行。

上述执行结果左边是在同一行输出,彼此用空格隔开两笔输入,右边是输入完3之后,按Enter键,然后输入7,相当于用Enter键隔开所输入的两笔数值。

笔者测试Dev C++编译程序,如果两笔格式符号间没有空格,也可以得到相同的结果,读者可以参考程序实例ch3_19.c,不过这会让程序的可读性比较差,所以不建议。

程序实例 ch3_19.c:重新设计程序实例ch3_18.c,用scanf( )函数读取两笔数值数据的应用,两个格式符号没有空格隔开。

程序实例 ch3_19_1.c:用scanf( )函数读取两笔数值数据的应用,两个格式符号是用逗号隔开。

3-2-2 读取字符数据

在输入整数或浮点数时,我们可以用空格隔开所输入的数据。但是输入字符时,字符间不可有空格。使用scanf( )读取字符时,常会发生读取字符错误的程序,如下列实例所示。

程序实例 ch3_19_2.c:scanf( )函数读取字符错误的实例。

在上述执行结果中,程序并没有等待我们输入字符(第12行),随即执行第13行输出执行结果,为什么会这样呢?因为当输入阿拉伯数字9,再按Enter键后,第10行的scanf( )函数读取到9,并赋值给整数变量i。当按Enter键时,对计算机系统而言,它代表Carriage Return(归位,ASCII码值是13)和Line Feed(换行,ASCII码值是10)。当第一个scanf( )(第10行)读到Carriage Return字符时便认为读取已经结束,此时读取缓冲区还有Line Feed字符(ASCII码值10,这是不可打印字符),所以程序执行第12行的scanf( )时,将直接读取缓冲区内暂存的Line Feed字符,列出ASCII码值是10,由于这是不可打印字符,所以尝试打印字符时,出现的结果是空白。

下列是程序实例ch3_19_2.c的另一个测试结果,笔者采用的是在输入9之后立刻输入f,读者可以观察结果。

上述第10行scanf( )读取整数时,尽管输入是“9f”,但只读取前面的9,同时将9赋值给变量i,此时f字符会在读取缓冲区内,当第12行读取字符时,所输入的字符f会被读入字符变量ch内。

一个程序若是输入需用这种方式读取字符是不好的设计。改良方式是在scanf( )函数的“%c”之前预留空格,这种设计方式可跳过不可打印字符,再读取可打印字符,可参考程序实例ch3_19_3.C。

程序实例 ch3_19_3.c:改良式scanf( )的用法。主要是在“%c”前加空格,可跳过不可打印字符。

本程序与上一个程序最大的差异是在第12行的“%c”前多了一个空格,由于它可跳过不可打印字符,因此输入“f”时,可供第12行的scanf( )正常读取,由于此f字符的码值是102,所以可以得到上述执行结果。

此外,C语言也提供一个清除缓冲区的函数fflush( ),使用方式如下:

fflush(stdin); /* stdin代表输入设备,即键盘 */

上述可将输入缓冲区的数据清除,整个使用情形可参考下列实例。

程序实例 ch3_19_4.c:fflush( )函数的使用,可修正程序实例ch3_19_2.c的问题。

上述程序实例的重点在于第12行多了fflush(stdin)函数,执行结果则和程序实例ch3_19_3.c相同。 RWouKRoIfnOxnWXT5CBRe0Dal41AXOuTxZK88wogycayTM3zhQ/6G3Gm70Qffelc

点击中间区域
呼出菜单
上一章
目录
下一章
×