C 程序设计教程(09)—— 数据输出函数(printf)用法详解

news2024/11/16 10:34:08

C 程序设计教程(09)—— 数据输出函数(printf)用法详解

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

目录

  • C 程序设计教程(09)—— 数据输出函数(printf)用法详解
    • 一、C 语言的赋值语句
    • 二、数据的输出 —— printf 函数
        • 1、printf 函数的一般形式
        • 2、格式字符
        • (1)d 格式符
        • (2)o 格式符
        • (3)x 格式符
        • (4)u 格式符
        • (5)c 格式符
        • (6)s 格式符
        • (7)f 格式符
        • (8)e 格式符
        • (9)g 格式符
        • 3、printf 函数格式字符使用总结
        • (1)标志字符
        • (2)宽度指示符
        • (3)精度指示符
        • (4)长度修正符

一、C 语言的赋值语句

赋值语句与赋值表达式相同,是程序中使用最多的语句之一。赋值语句的格式如下:

赋值表达式;

说明:

(1)当一个变量未获得数据时,通过赋值,就把赋值号右端的表达式的值存入该变量所代表的存储单元中。

(2)当一个变量已获得了数据,通过赋值,就把赋值号右端的表达式的值存入该变量所代表的存储单元中,并覆盖原来的值。

(3)当读取变量的值时,该变量的值并不消失。

(4)由于在赋值运算符(=)右边的表达式可以是一个赋值表达式。因此,形如 a=b=b=d=5; 的语句是正确的。按照赋值运算符的右结合性,该语句实际等价于:

d=5;
c=5;
b=5;
a=5;

(5)注意在变量说明中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其他同类变量之间必须用逗号分隔,而赋值语句则必须用分号结尾。例如:

int i=1,j=2;
int a,b;
a=1;
b=2;

(6)严格区分赋值表达式和赋值语句。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。

二、数据的输出 —— printf 函数

为了实现输入和输出功能,C 语言在其库函数中提供了一组输入输出函数:putchar(输出字符)、getchar(输入字符)、printf(格式化输出)、scanf(格式化输入)。其中 scanf 和 printf 函数是针对标准输入输出设备(键盘和显示器)进行格式化输入输出的函数。由于它们在文件 stdio.h 中定义,所以在使用它们时,应使用编译预处理命令 #include<stdio.h> 将该文件包含到程序文件中。

1、printf 函数的一般形式

printf 函数称为格式化输出函数,printf 函数的格式为:

printf("格式控制字符串",输出项列表);

说明:

(1)“格式控制字符串”是用双引号括起来的字符串,包括以下两种信息:

① 格式说明符:作用是将要输出的数据转换成指定的格式输出。由 “%” 和格式字符组成,如:%d,%f 等。

② 普通字符:即原样输出的字符。

例如:

printf("a=%d,b=%d\n",a,b);

其中:%d 是格式说明符,其余都是普通字符(包括a=、逗号 ,、b=、\n)。如果 a=10,b=20,则该输出语句的输出结果为:

a=10, b=20

(2)输出列表是需要输出的数据,输出列表中的各项要用逗号间隔,每个输出项可以是合法的常量、变量、表达式或函数。格式说明符的个数要与输出项的个数相同、一一对应且类型匹配。例如:

int a=20;
float b=13.5;
printf("a=%d,b=%f\n",a,b);

由于 printf 是函数,因此,“格式控制符” 和 “输出列表” 实际上都是函数的参数。printf 函数的一般形式也可以表示为:

printf(参数1, 参数2, ... ,参数n);

printf 函数的本质是将参数2~参数n 按参数1给定的格式输出。

2、格式字符

对不同类型的数据使用不同的格式字符,常用的有以下几种格式字符:

(1)d 格式符

用来输出十进制整数。

① %d,按整型数据的实际长度输出。

② %md,m为指定输出数据的宽度。如果数据的位数小于m,则左端补空格,若大于m,则按实际位数输出。

例如:

int a=134, b=12345;
printf("%5d,%4d",a,b); //输出结果为:  134(左侧补两个空格), 12345

③ %ld,输出长整型数据

long a=123456;
printf("%ld",a);
//如果按%d输出,会发生错误
//长整型也可以指定宽度,如:printf("%7ld",a);
//一个int型数据可以用%d或%ld格式输出

(2)o 格式符

以八进制形式输出整数。由于是将内存单元中各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即符号位也一起作为八进制数的一部分输出。例如:

int a=-1;
printf("%o",a); //输出结果为:177777

对长整型(long 型),可以使用 %lo 格式输出,也可以指定输出宽度,例如:

int a=-1;
printf("%8lo",a); //输出结果为:  177777

(3)x 格式符

以十六进制形式输出整数。同样不会出现负的十六进制数。

例如:

int a=-1;
printf("%d,%x",a,a); //输出结果为:-1,ffff

可以使用 %lx 输出长整型,也可以指定输出数据的宽度,如 %12x 等。

(4)u 格式符

以十进制输出 unsigned 型数据。

一个有符号整数(int)也可以用 %u 格式输出;反之,一个 unsigned 型数据也可以用 %d 格式输出。unsigned 型数据也可以用 %o 或 %x 输出。

(5)c 格式符

用来输出一个字符。例如:

char ch='A';
printf("%c\n",ch);  //输出结果:A

一个整数,只要它的值在 0~255 之间,也可以用字符形式输出。在输出前,将该整数转换成 ASCII 字符,反之,一个字符型数据也可以用整数形式输出。例如:

char ch='A';
int x=97;
printf("%c",ch); //输出:A
printf("%d",ch); //输出:65
printf("%c",x); //输出:a
printf("%d",x); //输出:97

(6)s 格式符

用来输出一个字符串。

① %s,按实际格式输出字符串。

例如:

printf("%s","China");  //输出结果:China

② %ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若字符串小于m,则左边补空格。例如:

printf("%10s","China");  //输出结果:     China

③ %-ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若字符串小于m,字符串左对齐,右边补空格。例如:

printf("%10s%d","China",20);  //输出结果:China     20

④ %m.ns,输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右端,左补空格。例如:

printf("%5,2s","China");  //输出结果:   Ch

⑤ %-m.ns,输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的左端,右补空格。例如:

printf("%-5,2s,%d","China",20);  //输出结果:Ch   20

(7)f 格式符

以小数形式输出实数。(包括单精度、双精度)

① %f,系统自动指定输出宽度,使整数部分全部输出,并输出6位小数。

② %m.nf,指定输出的数据共占m列,其中有n位小数。如果数据长度小于m,则左端补空格。

③ %-m.nf,指定输出的数据共占m列,其中有n位小数。如果数据长度小于m,数据左对齐,右端补空格。

例如:

#include<stdio.h>
int main() {       
	float f=123.456;
	printf("%f,%10f,%10.2f,%-10.2f,%.2f",f,f,f,f,f);
	return 0;
} 

以上程序的运行结果如下:

在这里插入图片描述

(8)e 格式符

以指数形式输出实数。

① %e,不指定输出数据所占的宽度和数字部分小数位数,由系统自动给出6位小数,指数部分占5位(如e+013),其中e 占一位,指数符号占一位,指数占3位。例如:

printf("%e",123.456); //输出:1.234560e+002

② %m.ne 和 %-m.ne,指定输出的数据共占m列,其中有n位小数。

(9)g 格式符

用来输出实数,根据数值的大小,自动选用 f 格式或 e 格式(选择输出时占宽度较小的一种),且不输出无意义的零。

3、printf 函数格式字符使用总结

printf 函数的格式字符

格式字符说明
d,i以带符号的十进制形式输出整数(正数不输出符号)
o以八进制无符号形式输出整数(不输出前导符0)
x,X以十六进无符号形式输出整数(不输出前导符0x),用小写x则输出十六进制数的a~f时以小写形式输出,用大写X时,则以大写字母输出。
u以无符号十进制形式输出整数。
c以字符形式输出,一次输出一个字符。
s输出字符串。
f以小数形式输出单精度和双精度型,隐含输出6位小数。
e,E以指数e或E形式输出实数。
g,G选用%f或%e格式中宽度较短的一种格式,不输入无意义的0。用G时,若以指数形式输出,则指数以大写表示。

说明:如果需要输出字符%,则在“格式控制字符串”中连续用两个%表示。例如:

printf("%f%%",0.5); //输出结果:0.50000%

在格式说明中,可以在%和上表中的格式字符之间插入以下几种附加符号。

(1)标志字符

标志字符包括-、+、#三种,具体含义如下表所示:

字符意义
-输出结果左对齐,右边填空格;默认则输出结果右对齐,左边填空格
+输出值为正值时冠以“+”号,为负时冠以“-”号
#八进制输出时加前缀 0;十六进制输出时加前缀 0x

例如:

printf("%6d,%d\n",111,2); //输出结果:   111,2
printf("%-6d,%d\n",111); //输出结果:111   ,2
printf("%+d,%+d\n",111,-111); //输出结果: +111,-111
printf("%#o,%#x\n",10,16); //输出结果:012,0x10

(2)宽度指示符

用来设置输出数据项的最小宽度,通常用十进制整数来表示输出的位数。如果输出数据项所需实际位数多于指定宽度,则按实际位数输出,如果实际位数少于指定的宽度则用空格填充。例如:

printf("%d,%d\n",888,12);  //输出结果:888(按实际需要宽度输出),12
printf("%6d,%d\n",888,12);  //输出结果:   888(左边补3个空格),12
printf("%-6d,%d\n",888,12);  //输出结果:888   ,12(右边补3个空格)
printf("%f,%d\n",888.88,12);  //输出结果:888.880000(按实际需要宽度输出),12
printf("%12f,%d\n",888,12);  //输出结果:  888.880000(左边补2个空格),12
printf("%g,%d\n",888,12);  //输出结果:888.88(%f格式比%e格式输出宽度小),12
printf("%8g,%d\n",888,12);  //输出结果:  888.88(左边补2个空格),12

(3)精度指示符

以“.” 开头,用十进制整数指定其精度。对于 float 和 double 类型的浮点数可以用 m.n 的形式在指定宽度的同时指定其精度。其中,m 用以指定输出数据所占总的宽度,n 称为精度。例如:

printf("%.5d\n",888);  //输出结果:00888(数字前补0)
printf("%.0d\n",888);  //输出结果:888
printf("%d,%8.3f\n", 11, 888.88);  //输出结果:11, 888.880(左边补一个空格)
printf("%d,%8.1f\n", 11, 888.88);  //输出结果:11,   888.9(左边补3个空格)
printf("%d,%8.0f\n", 11, 888.88);  //输出结果:11,     888(左边补5个空格)
printf("%.5s","abcdefg");  //输出结果:abcde(截去超过的部分)
printf("%5s","abcdefg");  //输出结果:abcdefg(宽度不够,按实际宽度输出)

(4)长度修正符

常用的长度修正符有 h 和 l 两种,h 表示输出项按短整型输出,l 表示输出项按长整型输出。

数据输出举例:

#include<stdio.h>
int main() {       
	int n1=123;
	long n2=1234567;
	float real=123.4567;
	printf("%d,%6d,%-6d,%2d\n",n1,n1,n1,n1);
	printf("%ld,%8ld,%4ld\n",n2,n2,n2);
	printf("%f,%10f,%10.2f,%-10.2f",real,real,real,real);
	printf("%s,%10.5s,%-10.5s","student","student","student");
	return 0;
} 

以上程序的运行结果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python小案例

1、简单的打印输出 age =18 print("我的名字是%s,我的国籍是%s"%("小张","中国")) print("我的年纪是:%d岁"%age) print("www","baidu","com",sep=".") #sep是使用.分割的意思,这个输出是百…

微信小程序开发——小程序的宿主环境API,协同工作和发布

一.小程序API概述 小程序中的 API 是由宿主环境提供的&#xff0c;通过这些丰富的小程序 API &#xff0c;开发者可以方便的调用微信提供的能力&#xff0c;例如&#xff1a;获取用户信息、本地存储、支付功能等。 二.小程序API的3大分类 a.事件监听AP1 特点&#xff1a;以…

【服务器数据恢复】服务器硬盘掉线的数据库数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某公司服务器&#xff0c;配备24块FC硬盘&#xff0c;两块硬盘出现故障掉线&#xff0c;导致服务器上层的卷无法挂载。 服务器数据恢复过程&#xff1a; 1、查看服务器硬盘状态发现有两块硬盘离线&#xff0c;将服务器内的所有硬盘做好…

【数据结构-JAVA】栈(Stack)和队列(Queue)

栈1.1 栈的概念栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的数据元素遵守先进后出&#xff0c;后进先出的原则&#xff08;LIFO——Last In First Out&a…

【从零开始学习深度学习】41. 算法优化之RMSProp算法【基于AdaGrad算法的改进】介绍及其Pytorch实现

上一篇文章AdaGrad算法中提到&#xff0c;因为调整学习率时分母上的变量st\boldsymbol{s}_tst​一直在累加按元素平方的小批量随机梯度&#xff0c;所以目标函数自变量每个元素的学习率在迭代过程中一直在降低&#xff08;或不变&#xff09;。因此&#xff0c;当学习率在迭代早…

LeetCode 45. 跳跃游戏 II

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 解法1&#xff1a;&#xff08;动态规划 贪心&#xff09; 果然代码越短&#xff0c;思路越难。这题用的是动态规划贪心的思想。首先分析题意我们可以知道&#xff0c;从索引0这个点开始&#xff0c;我们走一步可以…

redis命令第二弹

1、redis命令-hash类型练习2、redis命令-list类型练习3、redis命令-set类型练习

YOLOV5环境搭建以及训练COCO128数据集

前言记录了自己训练coco128的全过程手把手教你YOLOV5环境搭建以及训练COCO128数据集。相关配置文件在百度网盘中。如果懒得话可以直接全部用我的数据一、准备工作1.1创建环境打开anaconda power shell&#xff08;最好以管理员身份运行&#xff0c;免得到后面相关文件权限进不去…

sentinel-介绍(一)

Sentinel Website&#xff08;Sentinel 官网网站&#xff09; Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么&#xff1f; 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级、系…

ansible配置yum源仓库

1.挂载本地光盘到/mnt 2.配置yum源仓库文件通过多种方式实现 仓库1 &#xff1a; Name: RH294_Base Description&#xff1a; RH294 base software Base urt: file:///mnt/BaseOS 不需要验证钦件包 GPG 签名 启用此软件仓库 仓库 2: Name: RH294_S…

LeetCode刷题模版:41 - 50

目录 简介41. 缺失的第一个正数42. 接雨水43. 字符串相乘44. 通配符匹配45. 跳跃游戏 II46. 全排列47. 全排列 II48. 旋转图像49. 字母异位词分组50. Pow(x, n)结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标…

axios系列之取消请求

文章の目录写在最后使用 cancel token 取消请求 Axios 的 cancel token API 基于cancelable promises proposal&#xff0c;它还处于第一阶段。 可以使用 CancelToken.source 工厂方法创建 cancel token&#xff0c;像这样&#xff1a; const CancelToken axios.CancelToken;…

Revit二次开发小技巧(十七)实时监控模型线的生成

前言&#xff1a;项目中需要一个需求&#xff0c;用户想调用出Revit中自带的绘制模型线方法&#xff0c;然后再绘制结束时&#xff0c;可以拿到绘制的模型线&#xff0c;然后实现后面的算法。这里记录一种方法&#xff0c;通过DocumentChange事件修改Tag的PropertyChanged事件来…

【Python】pandas获取全省人口数据并作可视化分析

前言 今天我们看看自己所在的省份的人口人数&#xff0c;使用pandas并作可视化分析。 环境使用 python 3.9pycharm 模块使用 pandasPandas 是基于NumPy的一种工具&#xff0c;该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型&#xff0c;提供…

java和vue募捐网水滴筹项目捐款爱心系统筹款系统

简介 募捐网&#xff0c;注册用户实名认证通过后可以发布募捐&#xff0c;管理员审核募捐通过后&#xff0c;前台用户可以看到该募捐信息&#xff0c;进行募捐或者举报&#xff08;管理审核举报成功后&#xff0c;会拉黑该募捐发起人&#xff09;&#xff0c;前台展示公告、爱…

83. 删除排序链表中的重复元素(链表)

文章目录题目描述方法一 暴力法方法二 递归法参考文献题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 示例 2…

酷开系统——家庭场景下的智能营销系统!

随着人们生活方式的改变&#xff0c;以往传统的营销资源和渠道正在慢慢陷入一个“无用”的尴尬境地&#xff0c;而作为家庭娱乐中心的智能大屏&#xff0c;近两年所表现出来的数据和效果却逐渐备受企业和品牌方关注&#xff0c;有数据显示&#xff0c;智能大屏的家庭覆盖规模正…

bug 站在一个测试的角度看bug

如何描述一个bug ?如何定义bug的级别 ?bug的生命周期 ?如何开始第一次测试 ?测试的执行和bug管理 ?产生争执怎么办 ?如何描述一个bug?作为一名测试人员&#xff0c;提bug是最基础的工作&#xff0c;那我们如何才能把bug提的清晰易懂呢?发现问题的版本 开发人员获取对应…

k8s之基于kubeadm搭建k8s集群

写在前面 你可能知道搭建k8s集群的kind&#xff0c;minikube工具&#xff0c;但是他们都太简单了&#xff0c;不能满足生产级的要求&#xff0c;想要真正的部署生产级别的k8s集群&#xff0c;我们还需要另外一个集群管理工具kubeadm ,本文就一起看下如何使用该工具来搭建k8s集…

STM32MP157驱动开发——Linux下的单总线驱动

STM32MP157驱动开发——Linux下的单总线驱动0.前言一、DS18B20 及工作时序简介1.DS18B20 简介2.DS18B20 时序简介4.DS18B20温度读取流程二、DHT11 及工作时序简介1.DHT11 简介2.DHT11 工作时序简介三、驱动开发1.DS18B20驱动1&#xff09;修改设备树2&#xff09;驱动编写2.测试…