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

news2024/9/23 8:56:36

目 录

  • 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.coloradmin.cn/o/2157120.html

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

相关文章

架构设计笔记-5-软件工程基础知识

知识要点 按软件过程活动&#xff0c;将软件工具分为软件开发工具、软件维护工具、软件管理和软件支持工具。 软件开发工具&#xff1a;需求分析工具、设计工具、编码与排错工具。 软件维护工具&#xff1a;版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工…

计算机毕业设计 基于Python的荣誉证书管理系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【永磁同步电机(PMSM)】 6. 矢量空间算法(SVPWM)

【永磁同步电机&#xff08;PMSM&#xff09;】 6. 矢量空间算法&#xff08;SVPWM&#xff09; 1. SVPWM 的基本原理1.1 SVPWM 的优点1.2 SVPWM 的电路拓扑1.3 连续旋转的空间矢量 2. SVPWM 的算法实现2.1 电压矢量组合方案2.2 SVPWM 的实现步骤 3. 基于 Simulink 的 SVPWM 仿…

软考高级:系统安全 -区块链特点:去中心化、开放性、自治性、安全性、匿名性

讲解 生活化例子 想象一下&#xff0c;你和朋友们玩一个共享账本的游戏。每个人都可以在账本上记账&#xff0c;没人可以单独改动账本&#xff0c;大家都可以随时查看账本内容&#xff0c;也不用再信任某个单独的人来管理账本。这就类似于区块链的工作原理。 概念讲解 去中…

软考高级:敏捷开发 SCRUM

生活化例子 想象你和朋友们要组织一场周末聚会。你们首先会决定聚会的主题、场地、时间等大方向&#xff0c;然后每个人分配不同的任务&#xff0c;比如有人负责买零食&#xff0c;有人负责准备音乐&#xff0c;有人负责布置场地。你们每天都简单沟通下进展&#xff0c;看看大…

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

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

“滑动窗口”思想在算法里面的应用

目录 一 无重复字符串的最长子串 链接&#xff1a;无重复字符的最长子串 1. 题目分析 解法一&#xff1a;暴力求解 借助2个“指针”&#xff1a;left &#xff0c; right 指针&#xff0c;依次固定left 指针&#xff0c;让right指针进行遍历&#xff0c;每遇到一个最大的 …

24/9/19 算法笔记 kaggle BankChurn数据分类

题目是要预测银行里什么样的客户会流失&#xff0c;流失的概率是多少 我这边先展示一下我写的二分类的算法 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model impo…

亚马逊IP关联揭秘:发生ip关联如何处理

在亚马逊这一全球领先的电商平台上&#xff0c;IP关联是一个不可忽视的问题&#xff0c;尤其是对于多账号运营的卖家而言。本文将深入解析亚马逊IP关联的含义、影响以及应对策略&#xff0c;帮助卖家更好地理解和应对这一问题。 什么是亚马逊IP关联&#xff1f; 亚马逊IP关联…

awk从0学习

1. 入门 1.1 什么是 awk&#xff1f; ①Awk是一种文本处理工具&#xff0c;适用于处理结构化数据&#xff0c;例如表格数据。 ②它可以读取一个或多个文本文件&#xff0c;并执行模式扫描和处理等指定的操作。 ③基本逻辑涉及数据的提取&#xff0c;排序和计算。 ④支持复…

Leetcode 2464. 有效分割中的最少子数组数目

1.题目基本信息 1.1.题目描述 给定一个整数数组 nums。 如果要将整数数组 nums 拆分为 子数组 后是 有效的&#xff0c;则必须满足: 每个子数组的第一个和最后一个元素的最大公约数 大于 1&#xff0c;且 nums 的每个元素只属于一个子数组。 返回 nums 的 有效 子数组拆分中…

Lumos学习王佩丰Excel第十五讲:条件格式与公式

一、使用简单的条件格式 1、为特定范围的数值标记特殊颜色 条件格式-需选择设定范围&#xff08;大于/小于/介于/......&#xff09;&#xff1a; 数值会动态根据条件判断更新颜色&#xff1a; 模糊匹配&#xff0b;条件格式&#xff1a;选择包含部分文本的特殊值 2、查找重复…

linux-----进程控制

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、fork()函数 返回值&#xff1a;子进程返回0&#xff0c;父进程返回子进程的id,出错就返回-1. fork创建子进程&#xff0c;如果父子一方发生写入时&#xff0c;就会发生写实拷贝&#xff0c;操作系统就…

专业学习|动态规划(概念、模型特征、解题步骤及例题)

一、引言 &#xff08;一&#xff09;从斐波那契数列引入自底向上算法 &#xff08;1&#xff09;知识讲解 &#xff08;2&#xff09;matlap实现递归 &#xff08;3&#xff09;带有备忘录的遗传算法 &#xff08;4&#xff09;matlap实现带有备忘录的递归算法 “&#xff1…

0基础跟德姆(dom)一起学AI 数据处理和统计分析06-数据组合和缺失值处理

* 数据组合 * concat * merge * join(了解) * 缺失值处理 * apply方法详解 --- 1.DataFrame数据组合-concat连接 * 概述 * 连接是指把某行或某列追加到数据中, 数据被分成了多份可以使用连接把数据拼接起来 * 把计算的结果追加到现有数据集&#xff0c;也可以使用连…

Redis:常用命令总结

目录 1 . 前置内容 1.1 基本全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 1.2 数据结构和内部编码 2. String类型 SET GET MGET MSET INCR INCRBY DECR DECRBY INCRBYFLOAT 命令小结​编辑 内部编码 3 . Hash 哈希类型 HSET HGET HEXISTS HDEL HKEYS …

Qemu开发ARM篇-5、buildroot制作根文件系统并在qemu中进行挂载启动

文章目录 1、 buildroot源码获取2、buildroot配置3、buildroot编译4、挂载根文件系统 在上一篇 Qemu开发ARM篇-4、kernel交叉编译运行演示中&#xff0c;我们编译了kernel&#xff0c;并在qemu上进行了运行&#xff0c;但到最后&#xff0c;在挂载根文件系统时候&#xff0c;挂…

嵌入式单片机STM32开发板详细制作过程--01

大家好,今天主要给大家分享一下,单片机开发板的制作过程,原理图的制作与PCB设计,以及电子元器件采购与焊接。 第一:单片机开发板成品展示 板子正面都有各个芯片的丝印与标号,方便焊接元器件的时候,可以参考。(焊接完成之后,成品图如下) 第二:开发板原理图制作 在制…

OpenCV系列教程三:形态学、图像轮廓、直方图

文章目录 一、形态学1.1 阈值处理1.1.1 全局阈值处理1.1.2 全局阈值处理之Otsus 阈值法1.1.3 自适应阈值处理 1.2 腐蚀与膨胀1.2.1 腐蚀操作1.2.2 创建形态学卷积核1.2.3 膨胀操作 1.3 开运算和闭运算1.4 形态学梯度1.5 顶帽操作(tophat)1.6 黑帽操作&#xff08;Black Hat&…

基于JAVA+SpringBoot+Vue的社区智慧养老监护管理平台

基于JAVASpringBootVue的社区智慧养老监护管理平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1…