C语言理解 —— printf 格式化输出

目 录

  • printf 函数
  • 一、短整型输出
  • 二、长整型输出
  • 三、浮点型输出
  • 四、字符型输出
  • 五、字符串输出
  • 六、注意问题


printf 函数

在软件开发过程中,通常需要打印一些字符串信息,或把一些变量值输出到上位机显示。打印函数printf是最常用的。

一般格式:

printf(格式控制字符串,输出值参数表);
  • 格式控制字符串

可以由三类字符(格式字符,转义字符,普通字符)组成。

格式字符 —— 由“%”引导,如%d、%f 等。作用是控制输出字符的格式。
转义字符 —— 转义字符按照转义后的含义输出,换行符“\n”,即输出回车。
普通字符 —— 原样输出的字符。

int sum = 0;
float temp = 0.314;
printf("sum=%d,temp=%f\n",sum,temp);
格式字符:%d和%f
转义字符:\n
普通字符:sum=,和temp=
  • 输出值参数表

1、可以是常量、变量或表达式。
2、输出值参数之间用逗号分隔,其类型应与格式字符相匹配。
3、每个格式字符和输出值参数表中的输出值参数必须一一对应。
4、没有输出参数时,格式控制字符串中不再需要格式字符,如:

printf("Are you OK?\n");

格式字符表

格式字符描述
d输出带符号的十进制整数,正数的符号省略,负数的符号正常输出
u以无符号的十进制整数形式输出
o以无符号的八进制整数形式输出,不输出前导符0
x以无符号十六进制整数形式(小写)输出,不输出前导符0x
X以无符号十六进制整数形式(大写)输出,不输出前导符0X
f以小数形式输出单、双精度数,隐含输出6位小数
e以指数形式(小写e表示指数部分)输出实数
E以指数形式(大写E表示指数部分)输出实数
g自动选取f或e中输出宽度较小的一种使用,且不输出无意义的0
c输出一个字符
s输出字符串

格式修饰符

格式修饰符描述
l修饰格式字符d、u、o、x时,用于输出long型数据
L修饰格式字符f、e、g时,用于输出long double型数据
h修饰格式字符d、o、x时,用于输出short型数据
输出域宽m(m为整数)指定输出项输出时所占的列数
显示精度.n(n为整数)对于实数,表示输出n位小数;对于字符串,表示截取的字符个数
-(减号)输出数字或字符在域内向左靠

一、短整型输出

  • d 格式字符
#include <stdio.h>
int main()
{short i = 2;int j=-68;long d = 0;d = i * 65536;printf("d = %ld\r\n",d);printf("j = %d\r\n",j);printf("size: i(%d)--d(%d)\r\n",sizeof(i),sizeof(d));return 0;
}

在这里插入图片描述
单字节变量用整型格式输出,最好加强制转换

int main()
{unsigned char i=0x51;printf("i = %d\r\n",(unsigned short)i);printf("size: i(%d)\r\n",sizeof(i));return 0;
}

在这里插入图片描述

二、长整型输出

一个设备的序列号是9位数字,比如100000151,那么它对应的十六进制是0x05F5E197。

从设备读出序列号并存到数组里。

unsigned char serial[4];serial[3] = 0x05;
serial[2] = 0xF5;
serial[1] = 0xE1;
serial[0] = 0x97;

将序列号以十六进制和十进制从串口打印出来。

#include <stdio.h>
int main()
{unsigned char serial[4]={0x97,0xE1,0xF5,0x05};unsigned long earbud_serial = 0;earbud_serial +=  ((unsigned long)serial[3]) << 24;printf("serial: 0x%08lX - %lu\r\n",earbud_serial,earbud_serial);earbud_serial +=  ((unsigned long)serial[2]) << 16;printf("serial: 0x%08lX-%lu\r\n",earbud_serial,earbud_serial);earbud_serial +=  ((unsigned long)serial[1]) << 8;printf("serial: 0x%08lX-%lu\r\n",earbud_serial,earbud_serial);earbud_serial +=  (unsigned long)(serial[0]);printf("serial: 0x%08lX-%lu\r\n",earbud_serial,earbud_serial);return 0;
}

在这里插入图片描述

三、浮点型输出

输出一个实数(包括单精度、双精度、长双精度),带有小数输出。

  • 基本型,%f

不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。

#include <stdio.h>
int main(){float f = 3.0;double df = 1.0;printf("f=%f,df=%f\n",f/3,df/6);return 0;
} 

在这里插入图片描述

实数中的整数部分全部输出,小数部分只输出6位。

  • 输出数据的宽度和小数位数,%m.nf

m表示输出数据的宽度,占多少列,n表示小数点后保留n位小数。
若不需强调输出数据宽度,可直接用%.nf

#include <stdio.h>
int main(){double a = 1.0;printf("%20.15f\n",a/3);return 0;
} 

在这里插入图片描述

在0前面有3个空格,小数点后输出了15位小数。
一个double型数只能保证15位有效数字的精确度,即使指定小数位数为50(如用%.50f),也不能保证输出的50位都是有效数值。

  • 输出的数据向左对齐,%-m.nf

加一个负号,能够让输出数据在域内向左靠齐

#include <stdio.h>
int main(){double a = 1.0;printf("%-8.15f\n",a/3);return 0;
} 

四、字符型输出

  • c 格式字符

输出一个字符,可以对照ASCII码表

#include <stdio.h>
int main(){char ch = 'e';char c = 0x54;printf("%c,%c",ch,c);return 0;
} 

在这里插入图片描述
也可以加格式修饰符指定域宽

#include <stdio.h>
int main(){char ch = 'e';char c = 0x54;printf("%6c,%c",ch,c);return 0;
} 

在这里插入图片描述

五、字符串输出

  • s 格式字符

输出一个字符串

#include <stdio.h>
int main(){printf("%s","are you ok?");return 0;
} 

在这里插入图片描述

六、注意问题

1、当格式控制字符串中没有%引导的格式字符时,则不需要有输出值参数表,直接输出字符串内容,转义字符按照转义后的实际意义输出

#include <stdio.h>
int main(){printf("nice to meet you!");printf("\n");printf("Hello,\ngood\t!");return 0;
}

在这里插入图片描述
2、当格式控制字符串中有%引导的格式字符时,则输出值参数表中的数量以及类型必须和格式字符一致,否则输出无法达到预期

#include <stdio.h>
int main(){int a = 158;double b = 16.8,c = 1.0;printf("a = %d,b = %d\n",a,b);printf("a = %d,c = %f\n",a);return 0;
}

在这里插入图片描述

第一个printf函数中的输出参数b是double型,但对应的格式控制符为%d,当类型不一致时并不会进行类型转换,而会将实际转入的double型值当作需要的整形类型来理解,因此出现非预期结果;
第二个printf函数中,格式控制字符串给出了两个%引导的格式字符,但是输出参数表中只有一个参数a。因此输出c的值默认为内存中a变量后面存储单元的数据值,即c的值不能确定。

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

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

相关文章

STM32篇:通用输入输出端口GPIO

一.什么是GPIO? 1.定义 GPIO是通用输入输出端口的简称&#xff0c;简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与 外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。 简单来说我们可以控制GPIO引脚的电平变化&#xff0c;达到我们的各种目的…

文献阅读(220)MRCN

题目&#xff1a;MRCN: Throughput-Oriented Multicast Routing for Customized Network-on-Chips时间&#xff1a;2023期刊&#xff1a;TPDS研究机构&#xff1a;韩国成均馆大学 这篇论文探讨的问题是多播死锁问题&#xff0c;下图中Packet A分成两条路径&#xff0c;但在rou…

伊丽莎白·赫莉为杂志拍摄一组素颜写真,庆祝自己荣膺全球最性感女人第一名

语录&#xff1a;女性应该做任何她们想做的事&#xff0c;批评她们的人都见鬼去吧。 伊丽莎白赫莉为《Maxim》杂志拍摄一组素颜写真&#xff0c;庆祝自己荣膺全球最性感女人第一名 伊丽莎白赫莉 (Elizabeth Hurley) 实在是太惊艳了&#xff0c;如今&#xff0c;《马克西姆》杂…

对话Chat和续写Completion的区别

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 对话Chat 对话Chat功能主要适用于模拟人类对话的场景&#xff0c;例如智能客服、智能问答和聊天机器人等。它允许用户与模型进行多轮次交互&#xff0c;从而模拟真实的对话…

Python中的数据可视化:从基础图表到高级可视化

数据可视化是数据分析和科学计算中不可或缺的一部分。它通过图形化的方式呈现数据&#xff0c;使复杂的统计信息变得直观易懂。Python提供了多种强大的库来支持数据可视化&#xff0c;如Matplotlib、Seaborn、Plotly等。本文将从基础图表入手&#xff0c;逐步介绍如何使用这些库…

mybatis 配置文件完成增删改查(一):直接查询所有信息

文章目录 编写三步走查询所有编写接口方法编写sql语句执行方法&#xff0c;测试结果数据库字段名和实体类变量名不一致&#xff1a;ResultMap数据库字段名和实体类变量名不一致&#xff1a;方法二 编写三步走 编写接口方法&#xff1a;Mapper接口 参数有无 结果类型编写sql语句…

分布式环境中解决主从延时的一些思路

目录标题 MySQL主从复制复习为什么要做主从复制&#xff1f;主从复制的原理主从延迟的原因&#xff1f; 解决思路1. 读写分离与延迟容忍2. 异步复制优化3. 缓存机制&#xff08;常用&#xff09;4. 最终一致性方案&#xff08;常用&#xff09;5. 主从切换与自动故障恢复&#…

多无人机通信(多机通信)+配置ssh服务

目录 多机通信 设备 主从机通信设置 配置从机 配置主机 测试 正式启用 MAVROS通信 多机通信 多机通信是实现机器人编队的基础&#xff0c;通过网络搭建通信链路。我们这里用中心节点网络通信&#xff0c;所有数据需有经过中心节点&#xff0c;所以&#xff0c;中心节点…

Codeforces Round 974 (Div. 3)D题解析

前三道太水了&#xff0c;第三道一眼二分&#xff0c;就是需要注意要超过一半人就行&#xff0c;我因为检查了好久 D. Robert Hood and Mrs Hood 抱歉&#xff0c;我是蒟蒻&#xff0c;我看到区间问题就想到了线段树&#xff0c;我们只需要用线段树去维护每个点药经历多少任务…

6.linux文件存储

目录 一&#xff0e;文件系流 1. 简介 2. 示例 二&#xff0e;文件链接 1.符号链接 2.硬链接 三&#xff0e;RAID 1.简介和类型 2.不同场景RAID的使用 3.RAID示例 一&#xff0e;文件系流 问题1:文件是如何准确放到磁盘的某个位置的? 问题2:文件是如何在磁盘(渺茫的…

re题(40)BUUCTF-[ACTF新生赛2020]Oruga

BUUCTF在线评测 (buuoj.cn) 查壳&#xff0c;64位elf文件&#xff0c;ida打开&#xff0c;定位入口函数 进入main里面&#xff0c;再看看sub_78A 猜测是个迷宫&#xff0c;看看byte_201020里是不是地图 _BOOL8 __fastcall sub_78A(__int64 a1) {int v2; // [rspCh] [rbp-Ch]in…

【有啥问啥】深度剖析:大模型AI时代下的推理路径创新应用方法论

深度剖析&#xff1a;大模型AI时代下的推理路径创新应用方法论 随着大规模预训练模型&#xff08;Large Pretrained Models, LPMs&#xff09;和生成式人工智能的迅速发展&#xff0c;AI 在多领域的推理能力大幅提升&#xff0c;尤其是在自然语言处理、计算机视觉和自动决策领…

开启争对目标检测的100类数据集-信息收集

DataBall 助力快速掌握数据集的信息和使用方式。 请关注我们的专栏&#xff1a;DataBall数据集合 &#xff08;计算机视觉&#xff09;_DataBall的博客-CSDN博客 感谢大家&#xff01; 争对数据的种类希望获得大家建议进行收集构建&#xff0c;符合市场大众的需求&#xff0c;欢…

【C++篇】引领C++模板初体验:泛型编程的力量与妙用

文章目录 C模板编程前言第一章: 初始模板与函数模版1.1 什么是泛型编程&#xff1f;1.1.1 为什么要有泛型编程&#xff1f;1.1.1 泛型编程的优势 1.2 函数模板的基础1.2.1 什么是函数模板&#xff1f;1.2.2 函数模板的定义格式1.2.3 示例&#xff1a;通用的交换函数输出示例&am…

【解密 Kotlin 扩展函数】自定义函数(十二)

导读大纲 1.1 在 Kotlin 中创建集合1.2 自定义 joinToString 函数来实现字符串打印 1.1 在 Kotlin 中创建集合 学习如何创建集合 使用setOf函数创建集合, 使用mapOf创建映射, 使用listOf创建列表<1> to 并不是一个特殊的结构体, 而是一个普通函数 infix修饰符表示这是一…

Spring Cloud Gateway 之动态uri 自定义过滤器

背景&#xff1a;第三方公司 请求本公司入参和出参一样的同一个接口&#xff0c;根据业务类型不一样需要不同业务微服务处理 &#xff0c;和第三方公司协商在请求头中加入业务类型方便我公司在网关成分发请求。 1&#xff1a;在spring cloud gateway yml 中加入路由 重点是 -…

人工智能领域-----机器学习和深度学习的区别

机器学习和深度学习都是人工智能领域中的重要概念&#xff0c;它们之间存在以下一些区别&#xff1a; 一、定义与概念 机器学习&#xff1a; 是一种让计算机自动学习和改进的方法&#xff0c;通过从数据中学习模式和规律&#xff0c;从而能够对新的数据进行预测或决策。涵盖了…

【C++笔试强训】如何成为算法糕手Day1

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 笔试强训第一天 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;两个数组的交集 暴力循环法&#xff1a; 哈希法 &#xff1a; 数组下标法&#xff1a; 第二题&#x…

MySQL:事务的ACID特性隔离级别脏读/不可重复读/幻读/Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务&#xff1f; 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务&#xff0c;执行修改后回滚 5.3 开始一个事务&#xff0c;执行修…

句子成分——每日一划(十)

目录 一、原句 二、主要句子成分 三、 分词短语部分 四、定语从句部分 五、结构总结 六、句子改良 一、原句 Z-Library has always been a part of my study, providing many books that would otherwise require a lot of time or money to find. 来源&#xff1a;写作…