《C语言程序设计:问题与求解方法》——2.12节数据输入—格式化输入库函数scanf()的用法

2.12 数据输入—格式化输入库函数scanf()的用法
在程序运行过程中,我们想要在某语句处暂时中断程序的运行,通过键盘输入数据到变量所对应的内存单元中,就要在程序中事先写好输入库函数调用语句。scanf()是格式化输入库函数,这是一种经常用到的输入库函数。
格式化输入库函数scanf()的调用,可以使得程序运行暂停下来,等待用户从键盘输入数据。程序用户可以通过键盘输入一个(或多个)数值;输完数据后,还要按下回车键,scanf()函数就会将这个(或多个)输入值(经过转换)存放到变量所对应的内存单元中。从scanf()函数返回后,接着运行程序后面的语句。
不过在调用scanf()函数时,第一个参数是相应的格式符%d、%f或%c,它们与要输入的变量类型的简单对应关系如表2-4所示。

调用库函数scanf(),通过键盘输入一个变量值的最简单形式是:
scanf( "格式符",&变量);
例如:

scanf("%f"  ,  & tenement_area ) ;  // 假设tenement_area是float型变量
scanf("%d"  ,  & age ) ;          // 假设age是int型变量
scanf(" %c"  ,  & ch ) ; //假设ch是char型变量,在 %c 之前,加了一个空格字符
请看以下程序:
#include<stdio.h>
int main(void)
{
    int  num ;
    float  x ;
    char  ch;
    printf("请输入总人数\n");
    scanf("%d" , & num ) ;
    printf("请输入现在的气温\n");
    scanf ("%f"  ,&x ) ;
    printf("请输入等级(A、B、C)\n");
    scanf(" %c" ,& ch ) ; //注意:此处在 %c左边加了一个空格,原因请参见书末参考文献

    printf("总人数是:%d\n气温是:%.2f\n 等级是:%c\n" , num, x,ch); //输出变量值
    return  0;
}
程序运行后,人机之间的交互过程如下:
请输入总人数            //计算机显示的输入提示
18                 //程序用户在键盘上输入的数据。“” 表示按下回车键
请输入现在气温          //计算机显示的输入提示
23.6                //用户在键盘上输入的数据
请输入等级(A、B、C)        //计算机显示的输入提示
B                 //用户在键盘上输入的数据
总人数是:18            //计算机显示的输出结果
气温是:23.60            //计算机显示的输出结果
等级是:B                 //计算机显示的输出结果

在本例程序中,交替使用了库函数printf()和scanf(),这使得程序可以在运行时与用户进行实时交互,实现“人机对话”(更准确地说,是计算机用户与运行着程序的计算机对话)。这样编写的程序用户比较喜欢。
常见编程错误:漏写输入项中变量左边的取地址运算符 “&”是调用scanf()函数时最为常见的编程错误。这个错误很可能使得程序在运行时崩溃。例如:
scanf(" %f", tenement_area ) ; //错误!
scanf("%f" , &tenement_area ) ; //正确!
多个变量值的输入
用于多个变量值的输入scanf()函数的调用方式如下:
scanf("格式符1格式符2格式符3",&变量1,&变量2, &变量3) ;
对于scanf()函数调用,格式串中格式符的个数要与输入项一样多,类型也要一一匹配。即格式符1要与变量1的类型匹配,格式符2要与变量2的类型匹配等。
注意:用一次scanf()函数调用,输入多个非字符类型的变量,程序运行时几个输入数据之间要用空格隔开,输完最后一个数据之后,再按下回车键。
但字符变量是例外,几个字符变量的值要连着用键盘输入,输入的字符之间不要用空格隔开,因为空格本身也是一个字符。
字符变量与其他类型数值变量最好不要用同一个scanf()函数调用输入,这样容易在输入时出错。
与printf()类似,在scanf()函数调用时,整型量也不能用格式符%f匹配,实型量也不能用格式符%d匹配。这也是初学者经常犯的严重编程错误。
有了上述这些知识,我们现在可以来完善例题2.5了。请读者先不看答案,自己独立做出来,然后与本书所给的答案比较一下。
经过修改完善的例题2.5如下所示:

1  #include <stdio.h>
2  #define  UNIT_PRICE  1.3   /*单价定义为符号常量*/
3  int  main(void)
4  {
5    float   tenement_area ;     /*定义变量:住宅面积*/
6    float   management_cost ;   /*定义变量:每月物管费用*/
7    printf("请输入住宅面积,单位是平方米\n");
8    scanf("%f" , & tenement_area );
9    management_cost= UNIT_PRICE * tenement_area ;   /* 求出每月物管费用*/
10   printf("住宅面积% 6.2f平方米 ,物管费% .2f元\n ",tenement_area , management_cost);
11   return  0;
12  }

编译通过后,请重复两次运行此程序,每次输入的面积不同,看看程序是否输出了相应不同的物管费用。
通过在编程时调用输入库函数,才使程序能够及时从输入设备(人操作的键盘)得到变量的当前值。
【问题1】第8行的语句能否写成:

1)  scanf("%f" ,   tenement_area );
2)  scanf("%d" , & tenement_area );
3)  scanf("%f , & tenement_area " );

为什么?
【问题2】如果漏写了上例中第8行的scanf()调用语句,结果将如何?
【问题3】能否将变量 tenement_area 定义为int型? 为什么?
延伸与拓展:printf()函数与scanf()函数调用时的一些重要区别
虽然格式化输入库函数scanf()在用法上与printf()有不少类似之处,但是,两者之间在使用上,也有以下所列的重要不同之处:
1)在printf()的格式串中可以使用转义字符 n来换行,但在scanf()的格式串中却不能使用转义字符 n(也不能使用其他一些转义字符)。
2)scanf()的格式串后面的参数是输入数据的存放地址,所以在通常情况下,变量名左边的取地址符号“&”是绝不能漏写的。例如,如果age是int型变量,那么

scanf("%d" , &age);
不能写成
scanf("%d" , age);
然而,对于printf()函数来说,以下语句却常常是一种误写:
printf("%d" , &age);
在VC++ 6.0编译环境下,这只是输出了变量age的内存地址。正确形式是:
printf("%d" , age);
这样才是输出变量age的值。
3)对于printf()函数来说,
printf("%d%d%d", n1,n2,n3) ;
不是好的形式,三个变量的值在输出时根本区分不开;而
printf("n1=%d,n2=%d,n3=%d", n1 , n2 , n3 ) ;
却是比较好的形式。
但是对于scanf()来说:
scanf("%d%d%d", &n1 , &n2 , &n3 ) ;
通常比较好,在输入三个数据之间只需输入一个空格将其分开;而
scanf("n1=%d,n2=%d,n3=%d",& n1 , &n2 , &n3 ) ;

却非常不好。你必须先从键盘键入“n1=”这些字符之后,才能输入变量n1的值,整个输入过程非常麻烦,完全是自讨苦吃。不信你可以亲自试一试。
4)printf()的输出项既可以是表达式和变量,也可以是常量和函数调用(注意:其实它们本质上都是表达式);而scanf ()的输入项通常只能是变量的地址,不能是通常的表达式。

时间: 2024-08-04 02:35:30

《C语言程序设计:问题与求解方法》——2.12节数据输入—格式化输入库函数scanf()的用法的相关文章

《C语言程序设计:问题与求解方法》——2.11节数据输出—格式化输出函数 printf()的用法

2.11 数据输出-格式化输出函数 printf()的用法 变量的值如果不从内存单元中取出来,通过输出设备送到计算机的外部,这个值对外界就不起任何作用,程序本身的运行也就失去了意义. 1.变量值的输出 格式化输出库函数printf()用来在某些常用的输出设备(PC的显示器或打印机)上输出双引号括住的格式控制串中的字符序列. 但是,printf()不仅可以像例题2.3那样,将格式串中的字符序列按照原样输出,还可以通过格式串的设置和控制,输出n个(n≥1)变量的值,其格式为:printf("占位符1

《C语言程序设计》一2.2 常量、数据的存储与数据类型

2.2 常量.数据的存储与数据类型 2.2.1 基本数据类型 数据是程序加工.处理的对象,也是加工.处理的结果,所以数据是程序设计中所要涉及和描述的主要内容.程序所能处理的基本数据对象被划分成一些组,或者说是一些集合.属于同一集合的各数据对象都具有同样的性质,程序设计语言中具有这样性质的数据集合称为数据类型. 所有数据都属于某种类型.一个数据的类型决定了这个数据在内存中的存储形式.取值范围和能够对它进行的操作. C/C++ 中的数据类型大致可以分为两大类:第一类是基本数据类型,基本数据类型是系统

《C语言程序设计:问题与求解方法》——导读

目 录 第0章 "理想厨房"的工作原理0.1 理想厨房系统0.2 理想厨房系统的一个炒菜实例0.3 "理想厨房"工作的重要特点0.4 理想厨房系统与计算机系统术语对照表本章习题第1章 计算机的基本工作原理1.1 二进制简介1.2 计算机系统1.3 提高部分本章习题第2章 C语言程序结构和基本语法要素2.1 高级程序设计语言和编译程序简介2.2 C语言历史概述2.3 C语言源程序的主要构成成分:函数定义2.4 C语言源程序的次要组成成分:编译预处理命令.注释和声明2.

c语言 c++-超级菜鸟 c语言程序设计求助

问题描述 超级菜鸟 c语言程序设计求助 Vc6 c++ 随机产生一个数学式子 提示使用者输入结果 判断是否对错 提示是否下一道题 最后在输出结果 跪求答案 继续有用 谢谢了

《C语言程序设计:问题与求解方法》——2.4节C语言源程序的次要组成成分:编译预处理命令、注释和声明

2.4 C语言源程序的次要组成成分:编译预处理命令.注释和声明下面我们通过更为完整的例题2.2来探讨C语言源程序的其他构成成分.[例题2.2]输入圆球的半径,求圆球的体积.C语言源程序如下: 0 /* 1 作者: 何勤 2 编写日期: 2009-12-25 3 功能: 输入圆球的半径,求圆球的体积 4 例题2.2 5 */ 6 #include <stdio.h> 7 #define PI 3.1416 /*指定符号常量PI的值为 3.1416 */ 8 int main(void) 9 {

《C语言程序设计:问题与求解方法》——2.17节提高部分

2.17 提高部分2.17.1 对字符量的进一步说明 由于英文常用字符集中的字符数(比如ASCII字符集中有128个字符)通常比C语言字符集中的字符数(共有92个)多,C语言中允许使用一种特殊形式的字符常量来表示英文常用字符,这就是以反斜杠开头的转义字符,此时反斜杠后面的字符将转变成一种另外的意义.转义字符的名称由此而来. 最常用的转义字符是'\n' , 用来表示换行.其他常用转义字符见表2-6. 在源程序正文部分书写转义字符的方法与普通字符类似,都必须用单引号括住,比如'\n'.但是在格式化输

《C语言程序设计:问题与求解方法》——2.10节变量

2.10 变量一些动态变化的量(比如车速.温度.股票价格等)称为变量,这些量在源程序中用常量无法表示.用C语言进行编程,要使用数据区(数据值可变)而不是代码区(数据值不允许变)的内存单元来存放数据,都必须向编译程序提出申请.在C语言源程序中,向编译程序申请一个(或几个)存放某种类型数据的.值的大小可以变化的内存单元称为定义变量. 2.10.1 变量的定义定义一个简单变量的格式为:类型名 变量名;类型名要使用关键字(比如int.float.char等,参见2.7节),变量名必须使用标识符.通过这种

《C语言程序设计:问题与求解方法》——3.9节常见编程错误

3.9 常见编程错误 通常,编程错误可以分为以下几类: 语法错误:可以在编译期间由编译程序找出的错误. 运行时错误:程序在运行时才能发现的错误. 算法错误:在编译和运行时都不能发现的,只有通过事先(编译前)或事后(程序试运行后)分析.检查结果才能发现的错误. 注意:编程时,首先要想方设法避免的是算法错误,因为对于一个规模较大的程序,如果在算法上有根本性的错误,有可能造成前功尽弃的严重后果.这就要求程序员在编写算法时仔细慎重,并掌握一些验证算法是否正确的方法. 下面列出了初学者极易犯的一些错误,在

《C语言程序设计:问题与求解方法》——3.6节变量类型的进一步讨论

3.6 变量类型的进一步讨论 第2章已经介绍了int .float和char 变量类型.但是在实际编程工作中,int型的取值范围和float型的精度很可能满足不了应用的需要,下面再介绍三种新的基本变量类型. (1)double类型 如果float 类型变量的精度达不到在应用中的要求(精度超过6位.取值范围不够大或者不足够接近0),那么可以使用double型变量. 虽然C语言标准没有规定double型变量的取值范围和精度,但是IEEE 754标准规定:double型变量的上下限取值范围是–1.79