顶部左侧内容
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 在线教程 > 正文

C 语言格式化输出函数中常用的格式符号

gosiye 2024-09-27 10:18 1 浏览 0 评论

在之前介绍输入输出函数的文章中,有提到格式化输入输出函数都有包含一种特殊的符号——格式符号。

那篇文章中关于格式符号也只是一笔带过,没有进行深入挖掘。本篇文章主要对输出函数(printf)中的一些常用格式符号进行详细补充。

1、介绍

格式占位符 % 加上特定的数字、字母,组成格式符号。

其作用是在字符串中占位,等后面传入的参数来进行替换。

printf 函数中,字符串里如果有格式符号,可变参数列表中就得有相应的参数(变量、常量、表达式等)。

#include<stdio.h>
int main()
{
  int a = 3+2;
  int c = 5;
  printf("有匹配内容:%d\n", a);
  printf("无匹配内容:%d\n");
  printf("a:%d, b:%d, c:%d\n", a, c)
  return 0;
}

如果不提供参数,打印的结果就会出现意料外的数据(随机值)

且格式字符匹配是按顺序的一个一个填进去。

2、整型

%d 是用来输出十进制的整数,对应的数据类型是 int 。

%u 也是用来输出十进制的整数,对应的数据类型是 unsigned int。和 %d 的区别在于,%d 可以输出负数,%u 只能输出正数

#include<stdio.h>
int main()
{
  int a=32, b=-32;
  printf("%%d输出:%d  %d", a, b);
  printf("%%u输出:%u  %u", a, b);
  return 0;
}

表示整数的格式符号,还有 %o 和 %x,分别输出 8 进制和 16 进制的整数。

其中 %x 中的 x 如果是小写的,输出结果中的字母也全都是小写;反之,X 是大写的,输出结果的字母也都是大写的。

#include<stdio.h>
int main()
{
  int a = 555, b=-555;
  printf("%%o输出:%o, %o\n", a, b);
  printf("%%x输出:%x, %x\n", a, b);
  printf("%%X输出:%X, %X\n", a, b);
  return 0;
}

同样,这两种格式符号也是输出没有符号的整数结果。和 %u 一样,当给定的是一个负数参数,结果虽然不是预期的,但也是有结果。至于这个结果怎么得到的,就涉及到二进制码的反码和补码,这里就不做具体展开。

无论是 int,还是其他整型,如 short、long、long long 类型,只要数值在 int 的范围内,也是能正常输出数值。

但如果数值大于 int 的最大范围,比如 long long 类型,就会出现意外结果。

#include<stdio.h>
int main()
{
  long long a = 555555555555555;
  printf("输出结果:%d\n", a);
  return 0;
}

比如在 32 位的编译器中,int 类型占 4 个字节,而 long long 类型占 8 个字节。用以上这些符号,只会识别前 4 个字节的内,后面 4 个字节的内容就会被舍弃掉,从而得出一个错误的值。

那么想要正常输出 long 或者 long long 类型的数值,就需要使用相应的格式符号。

long 类型对应的格式符号:%ld。

long long 类型对应的格式符号:%lld。

#include<stdio.h>
int main()
{
  long long a = 555555555555555;
  printf("输出结果:%lld\n", a);
  return 0;
}

3、浮点型

从定义上来看,%f 是用来输出单精度浮点数 float 类型,%lf 是用来输出双精度浮点数 double 类型。

但在实际测试中,符号的使用似乎对数据的精度不会产生影响。无论是 %f 还是 %lf,都是可以输出两种类型的值。

而对精度有最直接的影响是发生在定义中。

#include<stdio.h>
int main()
{
  double a1 = 2 / 3.0;
  double a2 = 2 / 3.0f;
  float a3 = 2 / 3.0;
  float a4 = 2 / 3.0f;
  printf("double类型a1输出%%lf:%.32lf\n", a1);
  printf("double类型a1输出%%f:%.32f\n", a1);
  printf("double类型a2输出%%f:%.32f\n", a2);
  printf("float类型a3输出%%lf:%.32lf\n", a3);
  printf("float类型a4输出%%f:%.32f\n", a4);
  return 0;
}

众所周知,2 / 3 是一个无限循环小数。但在计算机中是不可能存在无限循环的概念,最后都会有一个终止的时候。

而计算到什么时候才终止,就取决于数据类型所对应的内存空间能存储多少。

正常使用 %f 和 %lf,是默认保留小数点后六位,然后输出到屏幕上。但为了方便观察不同浮点数类型的精度缺失问题,于是多扩展到小数点后 32 位。

表现方式为 %.nf 或者 %.nlf,其中 n 必须是正整数,不能为负数。n 为多少,就保留到小数点后 n 位,同时进行四舍五入

从结果中可以发现,无论 %f 符号还是 %lf 符号,最终的输出结果对精度并没有直接的影响。

精度的影响是从变量定义开始的。

变量 a2 虽然是 double 类型的,但是后面的表达式中得出的是 float 类型的结果,而后再转变为 double 类型赋给变量 a2。

变量 a3 的表达式虽然计算后是 double 类型,但在赋值给变量 a3 的时候进行类型转换,从高到低的类转换,精度就会发生缺失。

4、字符和字符串

%c 在屏幕上输出一个字符,对应的是 char 类型。

%s 在屏幕上输出一连串的字符(字符串),对应的是 char * 指针类型。

字符这一对和上面的整型和浮点型不一样。

上面的两种类型,只要数值在范围内,同一个格式符号,输出不同类型的数据,也是能够正常显示。

但字符就不一样的,%c 对应的参数能用字符串吗?反之,%s 可以用单字符吗?

#include<stdio.h>
int main()
{
  char c = 'A';
  char *str = "A";
  printf("%%c对应参数为字符串:%c", str);
  printf("%%s对应参数为单字符:%s", c);
  return 0;
}

当使用 %c 格式符号,传入的参数是字符串,输出是可以输出,但得到的会是一个未知的符号。例如我运行后获得一个问号:

而使用 %s 格式符号,传入的参数是 char 类型的数据就会引发异常。

关于 %c 输入还有一个比较好玩的,有时候两个 %c,传入的参数是两个任意的整数,会构成一个新的字符,可能是汉字,或者其他字符。

#include<stdio.h>
int main()
{
  printf("组成的字符:%c%c\n", -99, 99);
  return 0;
}

5、指针

指针,C 新手的终点,C 高手的起点。

C 语言中很多操作都是依赖指针来进行的,而指针是直接对内存进行操作。

%p 符号中的 p 即 pointer,指针。顾名思义,该符号是用来向屏幕输出指针数据,即内存地址。

而内存地址,一般是以十六进制展现的。但和 %x 不同,%p 展示的格式是特定的。一般为 8 位,右对齐,结果不足自动补 0。

#include<stdio.h>
int main()
{
  int a = 1;
  int *p = &a;
  int arr[] = {1, 2, 3};
  printf("a的内存地址:%p\n", p);
  printf("p的内存地址:%p\n", &p);
  printf("arr的内存地址:%p\n", arr);
  printf("数组第一个元素额内存地址:%p\n", &arr[0]);
  return 0;
}

每一个内存都包含两个信息,一个是内存的地址,另一个是内存中存储的数据

直接调用基本数据类型(如整型、浮点型、字符型、指针等),获取的是内存中存储的数据。而要调用其所对应的内存地址,就需要通过寻址运算符(&)

例如,直接调用变量 a,输出的结果为 00000001。

直接调用指针变量 p 虽然打印的也是内存地址,但这不是它自身的地址,而是变量 a 的地址。因此,本质上还是调用了内存中所存储的数据

数组是一连串相同类型的不同元素,如果直接调用数组变量 arr,系统不知道你需要的是数组中的哪一个数据。

因此,数组变量往往存的是数组中第一个元素的内存地址。从结果中也可以看出。

而想要获取数组中具体某一个元素的内存地址,此时已经拆分成基本的数据类型,就要通过寻址运算符来获取。

文末

趁着周末休息的时间写一写文章,本来已经罗列了大纲,准备一口气详细整理下格式化输入输出函数中的格式符号。

在写作的过程中,新的问题不断地涌现,就又得去研究学习。单单就输出函数的格式符号一小部分内容就够衍生许多知识,因此只挑了几个常用的讲,其中可能还是不够全面。

如果全部输出,估计得上万了,且时间就得花费更多,所以一些内容留待后面再更新。

内容太多一来看起来比较累,二来消化起来也不容易。

最后写写改改,才输出这篇文章。写到后面有些昏了头,文中可能出现一些描述的不恰当,不够细致,或者有错误的地方,希望大家能够不吝指点一下,万分感谢。

最后,如果您觉得本篇文章对您有用,点个赞支持一下呗!

相关推荐

全球最大的H5网站模板库(h5页面模板下载)

当今社会,互联网迅猛发展,在网络营销中,客户往往通过企业的网站建设留下对该企业的第一印象,一个优秀的企业网站已成为企业发展的重要纽带,嗨创H5,拥有国内外一流的技术团队,潜心专研网站建设6年,是全球最...

wordpress集团公司网站模板:XSgr(wordpress建站公司)

小兽wordpress推出一款高端集团公司主题,打造高品质官网。高端是一种态度和坚持,因为我坚信贴合产品及品牌理念的高端深度定制才能最大化地呈现企业的务实严谨与产品的专业品质相比,某种程度上讲–...

私心推荐,小编酷爱的五款高逼格网站模板

建站宝盒的网站模板上千套之多,各有各的风格色彩,但是,弱水三千,小编我却只取一瓢饮,在这上千套模板之中,小编酷爱的网站模板有五套,让小编私心推荐一下吧!1、茶叶贸易公司网站模板小编对这款网站模板可是一...

「书讯」政府网站用户行为研究与应用

《政府网站用户行为研究与应用》作者:刘合翔著出版日期:2018年6月开本:16开出版社:经济管理出版社小编推荐《政府网站用户行为研究与应用》的主题是关于政府网站用户行为的特征规律及其在政府网站优...

免费服务器-搭建模板网站的操作流程(图文版)

之前发文《创业者的官网:如何搭建免费云服务器及操作面板(图文版)》,因为做了视频才发现,创业者对视频的需求,远远低于对图文解说的需求。因此,补充图文教程,不清楚的看官们,可以直接看视频版本进行细部学...

快收藏这些高逼格H5网站模板吧,不绕弯子直接下载

上面这些响应式H5网站是不是很炫酷,比起那些“在线一键生成”是不是好太多了?关键是,那些一键制作都不会开放源码给你,自定义性也很局限。不过说到底还是难看。今天笔者推荐大家一个模板网站,全都是高质量的响...

如何开发网站建设管理系统模板(如何开发网站建设管理系统模板图片)

根据用户网站需求文档设计美工图,并设计数据库结构,让网站开发人员可以更多地关注前台美工,先对照美工图,编写静态HTML页面,按网站建设管理系统模板语法,修改编写好的静态HTML页面,运行。不再需要对...

C语言的数据类型介绍(c语言的数据类型介绍是什么)

在计算机系统中,数据是放在内存中的,数字、文字、符号、图形、音频、视频等数据都是以二进制形式存储在内存中的,它们并没有本质上的区别,那么0001000该理解为数字8呢,还是图像中某个像素的颜色...

C 语言格式化输出函数中常用的格式符号

在之前介绍输入输出函数的文章中,有提到格式化输入输出函数都有包含一种特殊的符号——格式符号。那篇文章中关于格式符号也只是一笔带过,没有进行深入挖掘。本篇文章主要对输出函数(printf)中的一些常用格...

C#中的类型转换(c#数据转换类)

计算机存储的基本单位:字节我们知道一个字节(Byte)有8个比特(bit)构成,比特是存储的最小单位,表示0和1,但为什么计算机存储的基本单位是字节,而不是比特呢?假设我们要存储数字3(二进制:11...

Java8中String内存空间占用分析(电脑里下载的文件怎样删除才不会占用内存空间)

1.前言分析之前,简单回顾一下对象的内存分布。在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三部分:对象头、实例数据和对齐填充。对象头包含两部分内容:MarkWord和类型指针。实例数据...

「每日C语言」数据类型大小和取值范围

对于c语言来说,数据类型是一个很重要的概念和知识点,它涉及到的是内存的空间,这在和硬件交互的时候是非常重要的。K&R给出了7个数据类型相关的关键字,分别是:int、long、short、uns...

【c语言学习笔记】数据类型(c语言里面的数据类型)

c语言学习笔记,欢迎大家能在评论区提出我学习错误的地方方便我进行改正~在计算机中,计算机用二进制来储存数据,在c语言中有许多的数据类型用来存储数据,当然不同的数据类型所用的内存占用也不一样,下面就来用...

关于MySQL varchar类型最大值,原来一直都理解错了

我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。写在前面关于MySQLvarchar字段类型的最大值计算,也许我们一直都理解错误了,...

C语言数据类型的转换(c语言数据类型的转换方式)

类型转换在C语言程序中,经常需要对不同类型的数据进行运算,为了解决数据类型不一致的问题,需要对数据的类型进行转换。例如一个浮点数和一个整数相加,必须先将两个数转换成同一类型。C语言程序中的类型...

取消回复欢迎 发表评论: