09 sprintf、printf函数的源码

2023-05-16

实现printf以及Sprintf源码

printf函数的全称为格式化输出函数。之所以叫做格式化出,是因为这个函数提供有多种格式化输出方式,可以向标准输出中输出某种格式的内容。本文目标是详细的讲述printf函数的用法,写法,原理。

int printf(const char *format, ...); //...在C中是合法的
E. printf("%s,666,%s",a ,b);
"%s,666,%s"为format. printf是一个带有不定参量的函数

为了进一步理解不定参量,我们引入stdarg头文件,举个例子如何实现不定参量:

void printargs(int arg1, ...)
{
  va_list ap; //定义参数列表结构体
  int i;

  va_start(ap, arg1); //以最后一个已知参数作为第二参量
  for (i = arg1; i >= 0; i = va_arg(ap, int)) // 解析得到一个int型的参量
    printf("%d ", i);
  va_end(ap);
  putchar('\n');
}

int main(void)
{
   printargs(5, 2, 14, 84, 97, 15, -1, 48, -1);
   printargs(84, 51, -1, 3);
   printargs(-1);
   printargs(1, -1);
   return 0;
}

通过上述方式我们能够学会如何通过stdarg实现不定参量作为参数列表的函数。

那么下一步讲解printf的具体实现,首先printf需要完成能够接收%d、%s、%p等输出格式控制符,我们进行了如下的实现:

int vsprintf(char *out, const char *fmt, va_list ap) {
  char* buf_p = out;
  static char str_temp[64];
  while (*fmt != '\0') {
    if (*fmt != '%') {
      *buf_p++ = *fmt++; 
    }
    else {
      switch (*(++fmt)) {
      case 'c':
        char ch = va_arg(ap, int);
        *buf_p++ = ch;
        break;
      case 's':
        char* str = va_arg(ap, char*);
        size_t len_s = strlen(str);
        strcpy(buf_p, str);
        buf_p += len_s;
        break;
      case 'd':
        int num_d = va_arg(ap, int);
        char* num_d2str = itoa(num_d, (char*)&str_temp, 10);
        strcpy(buf_p, num_d2str);
        size_t len_d = strlen(num_d2str);
        buf_p += len_d;
        break;
      case 'p':
        int num_p = va_arg(ap, int);
        char* num_p2str = itoa(num_p, (char*)&str_temp, 16);
        strcpy(buf_p, num_p2str);
        size_t len_p = strlen(num_p2str);
        buf_p += len_p;
        break;
      default:
        break;
      }
      fmt++;
    }
  }
  *buf_p++ = '\0';
  return buf_p - out;
}

阅读上述代码,它能够实现对一串字符串的转义,能够将所有的格式控制符进行处理,并且将之最后的结果放入到字符串中。

那么很容易实现下列printf的函数:

int printf(const char *fmt, ...) {
  va_list args;
  int ret;
  va_start(args, fmt);
  ret = vsprintf(printf_buf, fmt, args);
  va_end(args);

  puts(printf_buf);
  return ret;
}

sprintf函数实现

sprintf只需要进行简单的改动即可

int sprintf(char *out, const char *fmt, ...) {
  va_list args;
  int i;

  va_start(args, fmt);
  i = vsprintf(out, fmt, args);
  va_end(args);
  return i;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

09 sprintf、printf函数的源码 的相关文章

  • nginx版本平滑升级(超详细)

    一 前期准备二 开始实验安装旧版本安装新版本 三 可能遇到的问题 文章背景 xff1a 护网期间 xff0c 客户跟我说nginx有0day漏洞 xff0c 需要版本升级 xff0c 我寻思着我也不是运维啊 xff0c 问我干嘛 xff08
  • AndroidStudio2021.3logcat工具无法显示日志解决办法

    我的AS版本 2021 3 日志没有任何输出 解决办法 1 File gt setting 2 搜索logcat xff0c 点击Experimental 3 把logcat对应的选项去掉 4 重启AS就可以看到日志信息
  • Ubuntu 20.04 安装mysql数据库教程

    1 首先安装mysql程序 命令 xff1a sudo apt install mysql server 2 安装完查看mysql启动状态 xff1a 命令 xff1a systemctl status mysql 3 直接使用root账户
  • 一文了解按位操作符中左移与右移

    无意中看到 gt gt lt lt gt gt gt 说实话一点也不知道这是什么 xff0c 带着好奇心去了解了一下 本文从一个小白的角度看这三个按位操作符的意思 xff0c 会相对好理解 按位操作符操作数字的二进制形式 xff0c 但是返
  • 2080Ti+win10+anaconda+pycharm+tensorflow-gpu(亲测有效)

    参考了很多方法 xff0c 发现一个非常智能的配置环境的方法 不用单独安装vc xff0c vs xff0c cuda xff0c cudnn xff0c 也不用考虑他们的版本搭配问题 xff0c 也不用环境变量的配置 可以通过不同的虚拟环
  • 乐维监控配置HTTPS访问教程

    前提条件 配置前需部署好的乐维监控系统 准备SSL证书 1 1 生成自签名证书 首先 xff0c 先生成自签名证书 这里提供一个快速生成证书的脚本 执行脚本需要输入一个IP或域名的参数 然后会在脚本所在目录下面生成名为ssl crt的证书和
  • Python tkinter布局与按钮间距设置

    新建label与button xff0c 并设置位置 xff08 grid xff09 import tkinter as tk root 61 tk Tk label 61 tk Label root text 61 Label labe
  • 程序设计思维与实践 - CSP - M2

    文章目录 程序设计思维与实践 CSP M2Problem A HRZ的序列DescriptionInputOutputSample InputSample OnputNoteIdeaCodes Problem B HRZ学英语Descrip
  • 程序设计思维与实践 Week8 作业

    文章目录 Problem A 区间选点 IIDescriptionInputOutputSample InputSample OnputNoteIdeaCodes Problem B 猫猫向前冲DescriptionInputOutputS
  • linux操作基础----系统管理

    linux操作基础 系统管理 基于之前三篇 xff1a linux基础操作之文件操作命令 linux基础操作之常用命令 linux基础操作之文件权限 xff0c 查找 xff0c 链接 继续总结linux的命令及操作 xff0c 本次对li
  • 可怕的宇宙射线

    题意 xff1a 宇宙射线会在无限的二维平面上传播 可以看做一个二维网格图 xff0c 初始方向默认向上 宇宙射线会在发射出一段距离后分裂 xff0c 向该方向的左右45 方向分裂出两条宇宙射线 xff0c 同时威力不变 宇宙射线会分裂n次
  • 平衡字符串问题

    题意 xff1a 一个长度为 n 的字符串 s xff0c 其中仅包含 Q W E R 四种字符 如果四种字符在字符串中出现次数均为 n 4 xff0c 则其为一个平衡字符串 现可以将 s 中连续的一段子串替换成相同长度的只包含那四个字符的
  • 买房问题

    题意 xff1a 蒜头君从现在开始工作 xff0c 年薪 NN 万 他希望在蒜厂附近买一套 6060 平米的房子 xff0c 现在价格是 200200 万 假设房子价格以每年百分之 KK 增长 xff0c 并且蒜头君未来年薪不变 xff0c
  • ubuntu 创建raid5教程

    1 查看磁盘 xff1a parted l 2 安装创建raid工具mdadm sudo apt install mdadm 3 创建命令 xff1a sudo mdadm Cv dev md0 l5 n3 dev sdb dev sdc
  • python+tesseract 训练和破解验证码(一)

    利用python及tesseract达到高效破解验证码的方式 xff0c 主要针对彩色背景 xff0c 包含数字 英文字母 xff0c 存在干扰性的简单验证码 前期准备 i window 10 ii python 3 8 iii tesse
  • SpringBoot项目启动不了, 控制台也没输出信息。就是什么反应也没有(已解决)

    1 启动项目 没反应界面 2 解决方法 File Settings Plugins groovy 去掉打勾的所有插件 3 启动成功
  • Django3.0入门【2】ORM关系模型:将model转入数据表

    采用ROM进行对象关系映射 O ObjectR relationM mapping 主要作用 xff1a 简化 SQL编写 xff0c 用对象的方式去替代 在 models py中生成models span class token keyw
  • 阿里云ECS服务器的搭建和部署

    一 购买服务器 1 首先要进行登录 xff0c 如果没有账号可以进行免费注册 xff0c 然后实名认证 xff0c 注册链接如下 xff1a 阿里云注册入口 阿里云注册入口 http www ccusoft com a htm 如下图所示
  • 记一次CentOS 8 部署packstack部署OpenStack失败案例,请直接看最后

    首先你需要一台安装好CentOS8 的虚拟机 xff0c 相关参数如图 两块网卡 xff0c 网卡1 NAT IP 192 168 100 100 GW 61 192 168 100 2 网卡2 可不做配置 能ping通百度 创建完成虚拟机
  • please ensure that VS 2013, VS 2015, VS 2017 or VS 2019 was installed with the Visual C++ option

    first rustup toolchain install stable x86 64 pc windows gnu then rustup default stable x86 64 pc windows gnu end cargo b

随机推荐

  • 顺序表函数

    include 34 Seq h 34 include lt stdlib h gt include lt stdio h gt 创建顺序表 Seq Create Seq s 61 Seq malloc sizeof Seq sizeof
  • Qt Creator中配置Opencascade

    Qt Creator中配置Opencascade 前言 xff1a 由于项目需要使用到STEP STP文件 xff0c 还需要三维建模 xff0c 于是就发现了一个工具 目前网上的资源 xff0c 专门分享这方面内容的是eryar大佬 xf
  • vs运行出错:error MSB8020或error LNK1104: 无法打开文件“opencv_calib3d248d.lib/opencv_contribxxxd.lib”

    error MSB8020 可能错误原因 xff1a 低版本的vs编译高版本的代码会出现这个错误 解决方式 xff1a 转换平台工具集 xff0c 如下 xff0c 改成自己有的 2 在菜单中依次选择 项目 gt 重定解决方案目标 让后F7
  • 倒水问题bfs解题思路

    题目 解题思路 倒水问题为隐式bfs问题 xff0c 初次见到无法马上想到利用bfs的思路解题 xff0c 但是弄清楚其中过程问题便可以引刃而解 此处可类比迷宫问题 flag数组标记两个水杯中的水量状态 xff0c bfs的终止条件即第二杯
  • 网页限制F12,接触教程

    开启右键菜单 document oncontextmenu 61 function return true 开启文字选择 document onselectstart 61 function return true 开启复制 documen
  • 区间覆盖问题-贪心求解

    题目 https vjudge net problem OpenJ Bailian 2376 题目大意 本题给定两个整数n和t xff0c n表示接下来会输入n段区间 xff0c t表示需要覆盖的区间为 1 t 题目要求利用输入的n段区间来
  • DDL问题-贪心算法

    题目 题目大意 本题给出了若干个任务的DDL和对应的分值 xff0c 要求得出最少扣分值 xff0c 也就是求出最大得分 在DDL前完成任务可以得分 xff0c 否则就不能 解题思路 本题与区间覆盖问题有一些相似之处 xff0c 因此在贪心
  • TT 的神秘礼物-二分答案

    题目 题目大意 题目给出了一个长度为N的数组cat xff0c 要求产生新数组ans xff0c 其中ans由所有abs cat i cat j 组成 xff0c 其中i j且1 i xff1c j N 要求求出ans排序后的中位数 xff
  • 【区间选点 II】差分约束

    题目 题意 给定一个数轴上的 n 个区间 xff0c 要求在数轴上选取最少的点使得第 i 个区间 ai bi 里至少有 ci 个点 使用差分约束系统的解法解决这道题 Input 输入第一行一个整数 n 表示区间的个数 xff0c 接下来的
  • 【东东学打牌】复杂模拟

    题目 题意 最近 xff0c 东东沉迷于打牌 所以他找到 HRZ ZJM 等人和他一起打牌 由于人数众多 xff0c 东东稍微修改了亿下游戏规则 xff1a 所有扑克牌只按数字来算大小 xff0c 忽略花色 每张扑克牌的大小由一个值表示 A
  • 【Max Sum Plus Plus】区间dp

    题目 HDU 1024 传送门 题意 东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 每个寝室里面有ai个人 1 lt 61 i lt 61 n 从第i到第j个宿舍一共有sum i j 61 a i 43 43 a
  • 【TT的奖励】动态规划

    题目 题意 在大家不辞辛劳的帮助下 xff0c TT 顺利地完成了所有的神秘任务 神秘人很高兴 xff0c 决定给 TT 一个奖励 xff0c 即白日做梦之捡猫咪游戏 捡猫咪游戏是这样的 xff0c 猫咪从天上往下掉 xff0c 且只会掉在
  • 【ZJM要抵御宇宙射线】CSP模测T2

    题目 题目大意 本题给出平面二维坐标上的若干个点 xff0c 要求选取一个点做圆心 xff0c 此时可以以最短半径包含所有点 xff0c 求出圆心坐标和最短半径平方 xff0c 结果保留两位小数 解题思路 本题乍看只下可能觉得会很复杂 xf
  • 【宇宙狗的危机】CSP模测T4

    题目 题目描述 在瑞神大战宇宙射线中我们了解到了宇宙狗的厉害之处 xff0c 虽然宇宙狗凶神恶煞 xff0c 但是宇宙狗有一 个很可爱的女朋友 最近 xff0c 他的女朋友得到了一些数 xff0c 同时 xff0c 她还很喜欢树 xff0c
  • 【猫睡觉问题】较复杂模拟

    题目 HDU 3700 Cat 题目大意 题目给出一只猫每天若干个时间段有任务 xff0c 没有任务时猫可以睡觉 题目还给出两个数A和B xff0c 表示猫每次睡觉时间不能少于A小时且每次醒着的时间不能多于B小时 题目要求输出一天猫可能睡觉
  • linux 部署django时报错django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.3 or newer is required

    1 在项目中 init py中这个报错原因 xff0c python 3 5以上版本不支持这种方式 from pymysql import install as MySQLdb install as MySQLdb 解决 xff1a imp
  • 栈求解最大矩形

    题目描述 给一个直方图 xff0c 求直方图中的最大矩形的面积 例如 xff0c 下面这个图片中直方图的高度从左到右分别是2 1 4 5 1 3 3 他们的宽都是1 xff0c 其中最大的矩形是阴影部分 Input 输入包含多组数据 每组数
  • 负权环路问题-SPFA算法的应用

    题目描述 这一晚 xff0c TT 做了个美梦 xff01 在梦中 xff0c TT 的愿望成真了 xff0c 他成为了喵星的统领 xff01 喵星上有 N 个商业城市 xff0c 编号 1 xff5e N xff0c 其中 1 号城市是
  • Ubuntu Linux 安装部署 code-server 在线代码编写环境(含卸载教程)

    Ubuntu Linux 安装部署 code server 在线代码编写环境 xff08 含卸载教程 xff09 安装 code server开启服务及密码修改设置code server开机自启动卸载 code server 安装 code
  • 09 sprintf、printf函数的源码

    实现printf以及Sprintf源码 printf函数的全称为格式化输出函数 之所以叫做格式化出 xff0c 是因为这个函数提供有多种格式化输出方式 xff0c 可以向标准输出中输出某种格式的内容 本文目标是详细的讲述printf函数的用