printf源代码的分析

2023-05-16

1、常见的格式

printf"show int: %d, char: %s", int val1, char *val2);
printfconst char *fmt, ...);

2、处理方式

  • 处理过程中主要采用了一个指针va_list 、3个函数 va_start()va_arg()va_end()

  • va_list args; //声明args,用于存储了所有的val1,val2,……,实际上是一个指针而已

  • va_start(args, fmt); // 得到第一个可变参数的地址,(也就是args的地址是从fmt之后开始,也就是”show int: %d, char: %c”之后)

  • int getval1 = va_arg(args, int); // 比如:第一个是int的型,则根据int型获取val1

  • 对fmt字符串进行一个循环操作,如果遇到”%号”,判断并获取数据类型,再通过va_arg()获取数据;

  • 注:int类型如何获取,通过对fmt字符串的判断,根据第一个”%号”后面的字符来确定 第一个参数的类型

  • va_end(args); // 清空args的指针

3、伪代码

printf(const char * fmt, ......)
{
    val_list args;   

    va_start(args, fmt);  // 获取第一个可变参数的地址,

    char *str;

    for(str = buf; *fmt; ++fmt)
    {
        // 如果不等于%继续查找,同时存储于str
        if (*fmt != '%') {
            *str++ = *fmt;
            continue;
        }

        遇到%号后,对%号后面的进行判断, 同时存储于str
        switch()
        case 'd':  va_arg(args, int); // 获取int类型    获取一个参数后,指针移至下一个参数
        case 's':  va_arg(args, char) // 获取char型
        case 'p'   va_arg(args, void *); // 获取指针
    }

    va_end(args);  // 将args指针置空

    最后str字符串就是printf最后的输出结果
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

printf源代码的分析 的相关文章

  • Shell GNU-Screen -X 的问题

    OPTIONS java Xms1024M Xmx1024M jar craftbukkit jar PROCESS server01 screen dmS PROCESS OPTIONS nogui Starting the applic
  • C99 printf 中的可变前导零

    我正在用 C99 编写一个多精度库 根据编译代码的平台 我选择不同的表示基础 因此 举例来说 假设在平台 X 上系统选择 BASE 100 并且在平台上Y BASE 10000 假设我代表大无符号整数 如下所示 typedef struct
  • 在 C/C++ 中打印前导空格和零

    我需要在数字前打印一些前导空格和零 以便输出如下所示 00015 22 00111 8 126 在这里 我需要打印leading spaces当数字是even and leading zero when odd 我是这样做的 int i d
  • 如何在 Eiffel 中格式化 DOUBLE 以仅打印两位小数?

    在埃菲尔铁塔中 你如何做到这一点 118 1999999999999 打印到 118 20 在其他语言中 这只是 printf 的问题 但在 Eiffel 中似乎没有办法轻松做到这一点 您应该使用类 FORMAT DOUBLE local
  • register_printf_specifier 的替代方案(使用 printf() 以二进制格式打印数字)

    据我所知 register printf specifier 现已弃用 我无法再使用 C99 编译器使用 register printf specifier 运行代码www onlinegdb com http www onlinegdb
  • 在 Perl 中打印 .00001 的解决方法

    我有这个程序 my d 40000 100 360 print At the equator n printf 9s 10 3f meters n 10 10 d for 0 7 它输出 At the equator By the way
  • printf("\033c") 是什么意思?

    我正在寻找一种在关闭程序后 重置 Unix 终端窗口的方法 并偶然发现printf 033c 效果很好 但我就是无法理解 我去了man console codes由于我对 Unix c 编程有点缺乏经验 所以它不是很有帮助 有人可以解释一下
  • printf("%d") 不显示我输入的内容

    My code printf Enter a number scanf d number printf d is what I entered n number I input 2 预期输出 2 is what I entered 实际输出
  • 将换行符添加到 printf() 相当于刷新流吗?

    以下程序显示了当发生 除以零 等错误时 缓冲 I O 如何导致程序出现问题 int main int a 1 b 0 c printf Dividing c a b printf Answer is d n c return 0 输出是Fl
  • bash 脚本中变量的转义

    我的 bash 脚本使用 printf 编写了另一个 bash 脚本 printf bin bash HOME server file gromacs file name basename file date date m d Y for
  • 如何使用 printf 制作“进度条”? [复制]

    这个问题在这里已经有答案了 许多命令行工具都实现基于文本的进度条 就像rpm安装一样 安装 45 the 随着百分比增长 同时保持在单行 我想要的是类似的东西 我需要一个进度指示器只占一行 也就是说 当百分比增长时 它被覆盖 而不是创建一个
  • 正则表达式精确单词匹配

    我需要匹配行中的单词 例如 The blue bird is dancing Yellow card is drawn The day is perfect rainy blue bird is eating 这四行位于文本文件中l2 我想
  • 避免 printf() 中的尾随零

    我一直在发现 printf 系列函数的格式说明符 我想要的是能够打印小数点后最大给定位数的双精度 或浮点数 如果我使用 printf 1 3f 359 01335 printf 1 3f 359 00999 I get 359 013 35
  • 使用 printf 在 c 中 fork() [重复]

    这个问题在这里已经有答案了 有 2 个不同的程序 它们都很小 例如 int main printf print hello fork int main printf print hello n fork 输出 1 是 print hello
  • 混淆 .fmt 行为与嵌套列表

    The docs https docs raku org routine fmt比如说fmt 返回一个字符串 其中列表中的每个元素都已根据以下格式进行格式化 format 第一个参数 并且每个元素由 separator 第二个论点 根据该描
  • 打印一个字符*

    我提前为这个愚蠢的问题道歉 这是我的结构定义 struct vcard char cnet char email char fname char lname char tel 我正在尝试使用函数 vcard show vcard c 打印此
  • JavaScript 相当于 printf/String.Format

    我正在寻找一个与 C PHP 相当的 JavaScriptprintf 或者对于 C Java 程序员来说 String Format IFormatProvider对于 NET 我的基本要求是目前数字的千位分隔符格式 但处理大量组合 包括
  • 使用 sprintf 打印元素数量可变的向量

    在下面的代码中 我可以打印向量中的所有元素item用空格分隔为 item 123 456 789 sprintf d d d item ans 123 456 789 我怎样才能做到这一点而不必输入那么多 d作为元素的数量item 最简单的
  • printf 中的 # 标志如何工作?

    include
  • Printf:Java 和 C 实现的差异

    今天我发现我无法使用 将宽度或精度参数传递给 Java 的实现printf 也就是说 以下论证printf在 C 中有效 但在 Java 中无效 d 10 3 d 10 3 0 d 10 3 5f 11 1 0 9 11 f 5 1 0 9

随机推荐

  • centos7安装CUDA11.2+CUDNN8.1+tensorflow2.4

    环境 xff1a 系统 xff1a centos7 CPU xff1a Intel R Xeon R Gold 5220 CPU 64 2 20GHz 36核 GPU xff1a Tesla V100 4 查看CPU信息 xff1a cat
  • 开源时序建模框架Kats

    KATS简介 时间序列分析建模是数据科学和机器学习的一个重要的领域 xff0c 在电子商务 金融 供应链管理 医学 气象 能源 天文等诸多领域有着广泛的应用 目前时间序列分析以及建模的技术非常多 xff0c 但相对散乱 Facebook开源
  • 包含动画的PPT转为PDF

    目的 xff1a 带动画的PPT转化为PDF xff0c PDF的每一页是动画的一个步骤 方法 xff1a 使用 宏 参考链接 xff1a https www codercto com a 70548 html 具体方法 xff08 win
  • windows中docker编写一个dockerfile文件

    Dockerfile文件描述了当我们启动镜像的时候需要哪些软件元素 除了软件元素之外 xff0c Dockerfile 还能够让我们能够在启动镜像的时候在容器中运行一些命令或者指明我们使用什么样的环境 使用虚拟机中的vim命令编写docke
  • spyder增加模块代码提示功能

    最近在配置tensorflow xff0c 可是发现使用spyder的时候无法加载tensorflow的代码提示 xff0c 需要自己输入完整的函数名称 xff0c 十分不方便 xff0c 于是从网上找了一些资料 xff0c 来解决spyd
  • conda activate报错:gbk相关错误

    使用conda create n 建立新的虚拟环境后 xff0c 使用activate无法进入虚拟环境 xff0c 报了一个和gbk相关的错误 xff0c 后来经排查发现 xff0c 是系统环境变量中包含中文字符 xff0c 把系统变量中所
  • scanf源码分析

    本文分析的是glibc2 31中的scanf相关源码 xff0c 目的不是研究scanf的算法 xff0c 而是说明scanf在IO attack中的利用方法 xff0c 属于CTF的范畴 scanf c 其实就是对 vscanf inte
  • windows建立定时任务执行bat脚本

    在Linux中我们可以通过crontab来定时执行脚本 xff0c 那么windows中如何执行呢 xff1f 为了避免分支冲突 xff0c 准备在每天上班的时候自动将git远程仓库的最新版本pull下来 xff0c 然后在下班时间自动将重
  • 需账号密码登陆的网页爬虫

    对于普通网页的爬取十分简单 xff0c 如果网站没有任何反爬机制 xff0c 只要以下代码就可以实现对于网页的爬取 span class token keyword import span requests html span class
  • sqlserver通过OPENJSON转换 json数据

    OPENJSON 行集函数可将 JSON 文本转换为一组行和列 使用 OPENJSON 将 JSON 集合转换为行集后 xff0c 可以在返回的数据上运行任意 SQL 查询或将其插入到 SQL Server 表中 OPENJSON 函数采用
  • [linux]armbian修改为清华源

    查看系统发行版本 命令lsb release a 本机为基于Debian的armbian buster 所以用清华Debian源 修改apt为清华软件源 备份原文件 sudo cp etc apt sources list etc apt
  • 基础的三角函数,反三角函数,双曲函数的图形绘制(matlab)

    matlab基本图形绘制 基础的三角函数 xff0c 反三角函数 xff0c 双曲函数的图形绘制 xff1b 在此过程 xff0c 可以熟悉基础的matlab指令 xff1b 三角函数 y1 61 sin x y2 61 cos x y3
  • tkinter实现带背景图片的登录窗口

    实现功能 xff1a 打开系统登录窗口 xff0c 输入用户名密码 xff0c 点击登录后跳转到程序主界面 xff0c 用户名密码在程序代码里 xff0c 注意运行时需要自己准备一张背景图片back png 主要代码 xff1a self
  • CCF 201809-3 2018年9月第三题元素选择器(python 100分题解)

    问题描述 试题编号 xff1a 3试题名称 xff1a 元素选择器时间限制 xff1a 10 0s内存限制 xff1a 512 0MB问题描述 xff1a 提交后100分代码 xff1a 注意标签选择器大小写不敏感 xff0c 匹配时都转成
  • GitHub项目徽章的添加和设置

    原文出处 xff1a https lpd ios github io 2017 05 03 GitHub Badge Introduction 许多同学在 GitHub 上发布了自己的开源项目 xff0c 有辛苦开发的实用工具 构思巧妙的开
  • 【C++】买鸡问题练手题

    C 43 43 买鸡问题 公鸡 5 元 1 只 xff0c 母鸡 3 元 1 只 xff0c 小鸡 1 元 3 只 xff0c 花了 100 元钱买 100 只鸡 xff0c 问公鸡 母鸡 小鸡各多少只 xff1f include lt i
  • 关于Vue中的axios数据异步 获取后,更改数据,页面没有更新

    更改axios数据后 xff0c 页面没有更新解决办法 列子解决 列子 span class token comment 页面视图HTML span span class token operator lt span span span c
  • C# ToString()方法一些特殊用法

    转帖 http hi baidu com crp8 blog item d19ab0cc131b8f1300e92869 html 一 取中文日期显示 1 年月日时分 currentTime ToString 34 f 34 不显示秒 2
  • 树莓派3B+ 搭建 esp32开发环境

    目前来说esp32的整体开发体验还是不错的 xff0c 关于esp32开发环境的搭建官方也有给出指导文档 xff08 https docs espressif com projects esp idf zh CN latest esp32
  • printf源代码的分析

    1 常见的格式 span class hljs built in printf span xff08 span class hljs string 34 show int d char s 34 span span class hljs k