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

简介:

本节书摘来自华章社区《C语言程序设计:问题与求解方法》一书中的第2章,第2.12节数据输入—格式化输入库函数scanf()的用法,作者:何 勤,更多章节内容可以访问云栖社区“华章社区”公众号查看

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


30bb1c8ad0b55eef84dacba88f599c795c829b36

调用库函数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 ()的输入项通常只能是变量的地址,不能是通常的表达式。

相关文章
|
24天前
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
96 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
28天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
58 10
|
28天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
45 9
|
28天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
38 8
|
28天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
46 6
|
28天前
|
存储 C语言 开发者
【C语言】格式化输出占位符及其标志字符详解(基于ISO/IEC 9899:2024)
在C语言中,格式化输出通过 `printf` 函数等格式化输出函数来实现。格式说明符(占位符)定义了数据的输出方式,标准ISO/IEC 9899:2024(C23)对这些格式说明符进行了详细规定。本文将详细讲解格式说明符的组成部分,包括标志字符、宽度、精度、长度修饰符和类型字符,并适当增加表格说明。
43 6
|
28天前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
203 6
|
28天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
59 6
|
28天前
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
39 5
|
1月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
51 6