• 格式控制字符串 format



    格式控制字符串由两部分组成:普通字符(非%字符)和转换说明。普通字符会进行原样输出,每个转换说明都会对应后续的一个参数,通常有几个转换说明就需要提供几个参数(除固定参数之外的参数),使之一一对应,用于控制对应的参数如何进行转换。如下所示:

    printf("转换说明 1 转换说明 2 转换说明 3", arg1, arg2, arg3);
    
    • 1

    这里只是以 printf()函数举个例子,实际上并不这样用。三个转换说明与参数进行一一对应,按照顺序方式一一对应。

    每个转换说明都是以%字符开头,其格式如下所示(使用[ ]括起来的部分是可选的):

    %[flags][width][.precision][length]type
    
    • 1

    flags:标志,可包含 0 个或多个标志;
    width:输出最小宽度,表示转换后输出字符串的最小宽度;
    precision:精度,前面有一个点号" . ";
    length:长度修饰符;
    type:转换类型,指定待转换数据的类型。
    可以看到,只有%和 type 字段是必须的,其余都是可选的。下面分别对这些字段进行介绍。

    ㈠、type 类型

    首先说明 type(类型),因为类型是格式控制字符串的重中之重,是必不可少的组成部分,其它的字段都是可选的,type 用于指定输出数据的类型,type 字段使用一个字符(字母字符)来表示,可取值如下:在这里插入图片描述

    ㈡、flags

    flags 规定输出样式,%后面可以跟 0 个或多个以下标志:在这里插入图片描述

    ㈢、width

    最小的输出宽度,用十进制数来表示输出的最小位数,若实际的输出位数大于指定的输出的最小位数,则以实际的位数进行输出,若实际的位数小于指定输出的最小位数,则可按照指定的 flags 标志补 0 或补空格。
    width 的可能取值如下:在这里插入图片描述

    ㈣、precision 精度

    精度字段以点号" . "开头,后跟一个十进制正数,可取值如下:在这里插入图片描述

    ㈤、length 长度修饰符

    长度修饰符指明待转换数据的长度,因为 type 字段指定的的类型只有 int、unsigned int 以及 double 等几种数据类型,但是 C 语言内置的数据类型不止这几种,譬如有 16bit 的 short、unsigned short,8bit 的 char、unsigned char,也有 64bit 的 long long 等,为了能够区别不同长度的数据类型,于是乎,长度修饰符(length)应运而生,成为转换说明的一部分。

    length 长度修饰符也是使用字符(字母字符)来表示,结合 type 字段以确定不同长度的数据类型,如下所示:在这里插入图片描述
    譬如:

    printf("%hd\n", 12345); //将数据以 short int 类型进行转换
    printf("%ld\n", 12345); //将数据以 long int 类型进行转换
    printf("%lld\n", 12345); //将数据以 long long int 类型进行转换
    
    • 1
    • 2
    • 3

    示例代码

    #include 
    #include 
    #include 
    #include 
    
    int main(void) 
    {
    	 char buf[50] = {0};
    	 printf("%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
    	 fprintf(stdout, "%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
    	 dprintf(STDOUT_FILENO, "%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
    	 sprintf(buf, "%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
    	 printf("%s", buf);
    	 memset(buf, 0x00, sizeof(buf));
    	 snprintf(buf, sizeof(buf), "%d (%s) %d (%s)\n", 520, "我爱你", 1314, "一生一世");
    	printf("%s", buf);
    	 exit(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    SpringBoot如何优雅的实现参数验证
    Docker 网络管理及资源控制
    详解DETR (End-to-End Object Detection with Transformers)
    Embedding技术与应用 (2) :神经网络的发展及现代Embedding方法简介
    【毕业设计】基于javaEE+SSH+mysql的码头船只出行及配套货柜码放管理系统设计与实现(毕业论文+程序源码)——码头船只出行及配套货柜码放管理系统
    AI绘画普及课【二】文生图入门
    微信小程序入门讲解【超详细】
    通信基础之天线知识梳理---2022/12/05
    Nginx优化
    【渗透测试】Apache Shiro系列漏洞
  • 原文地址:https://blog.csdn.net/Dustinthewine/article/details/126673210