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

简介:

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

2.11 数据输出—格式化输出函数 printf()的用法
变量的值如果不从内存单元中取出来,通过输出设备送到计算机的外部,这个值对外界就不起任何作用,程序本身的运行也就失去了意义。
1.变量值的输出
格式化输出库函数printf()用来在某些常用的输出设备(PC的显示器或打印机)上输出双引号括住的格式控制串中的字符序列。
但是,printf()不仅可以像例题2.3那样,将格式串中的字符序列按照原样输出,还可以通过格式串的设置和控制,输出n个(n≥1)变量的值,其格式为:
printf("占位符1占位符2......占位符n*",变量1,变量2,......,变量n) ;
“占位符1”的类型要与“变量1”的类型匹配,“占位符2”的类型要与“变量2”的类型匹配,……,“占位符n”的类型要与“变量n”的类型匹配。
在上式中使用了位于占位符左右两边的“ *” 号表示:在此处可以出现0个或任意多个按照原样输出的普通字符或者转义字符。
占位符也称为格式符,由符号“%”和转换说明符构成。常用的占位符有%d、%f或%c,它们与要输出的变量类型之间的简单对应关系如表2-3所示。


b51316f2cfbc7c71ecf81a007030f63d27563622

【例题2.4】示例程序。

1  #nclude<stdio.h>
2  int main(void)
3  {
4   int    num= 123 ; 
5   float  x=34.678 ;
6   char   ch='+';
7   printf("%d %f %c\n", num, x,ch); //将三个变量的值从对应内存单元中取出来输出
8   return  0;
9  }
程序运行结果为:
123 34.678000 +

此题的格式控制串是:"%d %f %cn"。
注意:在格式串中的三个占位符之间都加了一个空格字符。如果将格式串中的占位符连在一起书写“%d%f%c”,则几个输出项的数据就会紧密地连在一起,即12334.678000+,这是绝对不可取的。
本题中由于三个输出变量顺序已定(num, x,ch),所以格式串中的三个占位符之间的顺序绝不能调换。但是,可以在此题的格式串中加入任意多个普通字符(即按照原样输出的非空白字符)和转义字符。
如果变量num代表车牌号,x表示车速,而ch表示车辆是否要加油的话,那么,使用以下的printf()函数调用语句来替换以上程序的第7行,会变得更有实际意义:
printf("车牌号为:%d,车速是:%f千米/小时,加油标志: %cn", num ,x ,ch);
输出结果为:
车牌号为:123, 车速是:34.678000千米/小时, 加油标志: +
由此可见,“占位符”所起的作用是为所对应的、要输出的变量的值,在格式串中事先占据一个适当位置。
换句话说,在调用printf()函数时,所有输出变量的值都必须插入格式控制串中去,插入的位置是所对应的占位符事先为它占据的,与原样输出的普通字符(还包括必须转义输出的转义字符)结合起来,最终形成输出到显示(或打印机)上的信息。
【练习】将例题2.4中第7行的语句printf("%d %f %cn", num, x,ch);分别改为以下的形式,重新编译运行,看看会怎样?错在哪里?

1)printf("%d %f \n", num, x,ch);
2)printf("%d %f %c\n, num, x,ch");

2.对浮点型数据更精细的输出控制
对于小数形式的实型量,格式符 %f 默认规定小数点后面一共显示6位。要想改变默认规定的显示位数,可将占位符书写为: %.nf , n是你想要显示的小数点后经过四舍五入的位数。
例如,对于以下程序:

1 #include<stdio.h>
2 main(void)
3  {
4    x=34.6789 ; 
5    printf("x=%.2f",x);
6  }
输出结果为: 
       x=34.68      // x=是普通字符

如想控制数据输出的宽度,可以用%m.nf这种形式。m为数据占据的输出总宽度(包括整数部分、小数部分和小数点)。比如,将以上程序第5行改为“printf(“x=%6.2f”,x);”,那么输出结果为x= 34.68,不足部分将在左边填充空格。
3.占位符与变量类型的匹配问题
初学者经常犯的编程错误是类型不匹配,如将%d与浮点型数据匹配,将%f 与整型数据匹配。
例如,有如下定义“int i ; float x ;”,则以下两条语句都是错误的:
printf("%f" , i ); //错! 正确的是: printf("%d" , i );
printf("%d" , x ); //错! 正确的是: printf("%f" , x );
格式化输出库函数printf()的功能其实很强大,不仅可用它来输出多个变量的值,还可用它来输出多个表达式的值。它的用法也很复杂,容易用错。比较深入的讲解请参见下一章。
有了以上这些必要知识,现在我们终于可以开始编写一个简单程序了。
【例题2.5】求住宅的每月物管费用。 已知某住宅小区每平方米每个月的物管费用是1.3元人民币,求86.5平方米的一套住宅每月要交的物管费用是多少。
程序分析:每月的单位面积物管费用1.3元是一个常量,很少会改变,我们不妨用常量表示。住宅面积要用一个float型的变量tenement_area来表示,这是因为程序要处理的每套住宅的面积都可能不一样,而且不一定都是整数。
该住宅每月应交的物管费用也还要用一个变量来表示。显然还是应该用float类型来定义,该变量不妨用标识符management_cost 来命名。
一套住宅每月的物管费用应当是:1.3×tenement_area。
经过上述分析,我们可以编写出如下程序:

0  #include<stdio.h>
1 int  main(void)
2 { 
3  float   tenement_area=86.5  ;  /*定义实型变量时初始化为86.5*/ 
4  float   management_cost ;     /*定义实型变量物管费用*/
5  management_cost=1.3 * tenement_area ;  /* 求出每月物管费用*/
6   printf("每月物管费用为:%.2f元\n" , management_cost ) ; 
7  return  0;
8 }

【问题】是否可以把第6行语句中的分号、双引号和圆括号改为中文输入法下的分号、双引号和圆括号?请你亲自试一试。
运行以上程序,得到的结果是:
每月物管费用为:112.45元
程序说明:在C语言程序中,我们要使用C字符集中的 “” 替换“ ×” 表示要做乘法运算。这样一来,就可通过第5行的语句management_cost=1.3 tenement_area ; 求出每月要交的物管费用,并且存放在变量management_cost中。因为这条语句的含义是:计算出式子1.3 * tenement_area的值,并把它保存在变量management_cost所对应的内存单元中(这其实是一条本章后面将要详细讲解的赋值语句)。
但是,此程序还存在一个亟待解决的问题:这个程序不经过修改,只能计算面积为86.5平方米的住宅每月的物管费用。如果要计算其他面积住宅的每月物管费用,必须在每次运行之前修改程序的第3行并且重新编译。这对于程序的使用者来说非常麻烦—万一程序的编写者不在怎么办?
如果在程序每次运行时,能够通过键盘将实际的住宅面积输入变量tenement_area中,那么这个程序每一次运行就可以算出一套实际住宅的每月物管费用,也就可以不必每次都修改程序。
所以,在程序运行时,将程序变量需要的当前值,通过键盘输入内存的对应单元中去是非常重要的、必不可少的。这样增加了程序的适应性和灵活性。
下面一节将讨论如何调用格式化输入库scanf()函数,在程序运行时,通过键盘输入一个或多个变量的值,解决上述至关重要的问题。

相关文章
|
28天前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
24天前
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
96 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
29天前
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
3月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
246 88
|
1月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
51 6
|
1月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
1月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
64 11
|
2月前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
32 3
|
2月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
2月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储