C语言程序设计:简易版的printf函数实现

简易版的printf函数实现

功能说明

(1)使用putchar函数、va可变参完成printf函数基本功能的实现;
(2)函数说明:

实现对下列数据类型的输出,并返回成功输出打印的字符个数:

  • 整数(正负)的输出;
  • 字符串输出;
  • 浮点数(float、double)输出;
  • 字符输出;

函数实现

#include <stdio.h>
#include <stdarg.h>
#include <limits.h>
#include <inttypes.h>int myprintf(const char *format, ...) {va_list args;va_start(args, format);int char_count = 0; // 记录写入的字符数量while (*format) {if (*format == '%') {format++;switch (*format) {case 'c': {char c = va_arg(args, int);putchar(c);char_count++;break;}case 'd': {int d = va_arg(args, int);if (d == INT32_MIN) {putchar('-');putchar('2');d = 147483648; char_count += 2;} else if (d < 0) {putchar('-');d = -d;char_count++;}int divisor = 1;while (d / divisor >= 10)divisor *= 10;while (divisor > 0) {putchar(d / divisor + '0');d %= divisor;divisor /= 10;char_count++;}break;}case 's': {char *s = va_arg(args, char *);while (*s) {putchar(*s);s++;char_count++;}break;}case 'l': {format++;switch (*format) {case 'l':format++;if (*format == 'd') {long long ll = va_arg(args, long long);if (ll == LLONG_MIN) {putchar('-');putchar('9');ll = 223372036854775808LL; char_count += 2;} else if (ll < 0) {putchar('-');ll = -ll;char_count++;}unsigned long long divisor = 1;while (ll / divisor >= 10)divisor *= 10;while (divisor > 0) {putchar(ll / divisor + '0');ll %= divisor;divisor /= 10;char_count++;}}break;case 'f': {double lf = va_arg(args, double);int int_part = (int)lf;int fract_part = (int)((lf - int_part) * 1000000); if (lf < 0) {putchar('-');lf = -lf;char_count++;}int divisor = 1;while (int_part / divisor >= 10)divisor *= 10;while (divisor > 0) {putchar(int_part / divisor + '0');int_part %= divisor;divisor /= 10;char_count++;}putchar('.');char_count++;divisor = 100000;while (fract_part / divisor == 0) {putchar('0');divisor /= 10;char_count++;}while (divisor > 0) {putchar(fract_part / divisor + '0');fract_part %= divisor;divisor /= 10;char_count++;}break;}}break;}default:putchar(*format);char_count++;}} else {putchar(*format);char_count++;}format++;}va_end(args);return char_count;
}

测试代码

void test_myprintf_v1() {long long big_number = 12345678901234LL;double pi = 3.141592653589793;myprintf("hello word !\n"); myprintf("LONG LONG: %lld\n", big_number);myprintf("FLOAT: %lf\n", pi);myprintf("INT32_MIN: %d\n", INT32_MIN);myprintf("INT32_MAX: %d\n", INT32_MAX);myprintf("LLONG_MIN: %lld\n", LLONG_MIN);myprintf("%c\n", 'A');return ;
}void test_myprintf_v2() {int ret;//打印字符常量printf("System:\n");ret = printf("hello word\n");printf("成功打印:%d\n", ret);printf("MySelf:\n");ret = myprintf("hello word\n");printf("成功打印:%d\n", ret);putchar(10);  //打印整型变量 int a = INT32_MIN, b = INT32_MAX;printf("System:\n");ret = printf("a = %d, b = %d\n", a, b);printf("成功打印:%d\n", ret);printf("MySelf:\n");ret = myprintf("a = %d, b = %d\n", a, b);printf("成功打印:%d\n", ret);putchar(10);//打印字符char c1 = 'a', c2 ='3';printf("System:\n");ret = printf("c1 = %c, c2 = %c\n", c1, c2);printf("成功打印:%d\n", ret);printf("MySelf:\n");ret = myprintf("c1 = %c, c2 = %c\n", c1, c2);printf("成功打印:%d\n", ret);putchar(10);//打印字符串char s1[150] = "adasdc asd as a", s2[150] ="sdadas asda sdaas";printf("System:\n");ret = printf("s1 = %s, s2 = %s\n", s1, s2);printf("成功打印:%d\n", ret);printf("MySelf:\n");ret = myprintf("s1 = %s, s2 = %s\n", s1, s2);printf("成功打印:%d\n", ret);return ;
}int main() {test_myprintf_v2();return 0;
}

运行效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1501.shtml

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

相关文章

在CSDN创作了6个月,我收获了什么?文末送书~

作者主页&#xff1a;阿玥的小东东主页&#xff01; 正在学习&#xff1a;python和C/C 期待大家的关注哦 目录 一次很好的机会&#xff0c;让我开始了CSDN之旅 首先来看看我的几位领路人 创作动力 1W粉丝 在CSDN我收获了什么&#xff1f; 很高的展现量 认证创作者身份 社…

Java Web常见框架

1、Spring Framework Spring是一个非常强大的框架&#xff0c;用于构建企业级应用程序。它提供了全面的编程和配置模型。 2、Spring Boot 基于Spring&#xff0c;它简化了配置过程&#xff0c;使得启动和运行基于Spring的应用程序变得更快&#xff0c;更容易。 3、Hibernat…

【Linux】系统安全及应用

目录 一、账号安全基本措施 1.系统账号清理 2.密码安全控制 3.历史命令安全管理 4.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 5.ssh远程登录输入三次密码错误则锁定用户 二、Linux中的PAM安全认证 1.su命令的…

Redis入门到通关之数据结构解析-动态字符串SDS

文章目录 Redis数据结构-动态字符串动态扩容举例二进制安全SDS优点与C语言中的字符串的区别 Redis数据结构-动态字符串 我们都知道 Redis 中保存的Key是字符串&#xff0c;value 往往是字符串或者字符串的集合。可见字符串是 Redis 中最常用的一种数据结构。 不过 Redis 没有…

Android Studio超级详细讲解下载、安装配置教程(建议收藏)

博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战&#xff0c;深受全网粉丝喜爱与支持✌有…

ES是什么?ES的使用场景有哪些?分词器??

一、ES是什么&#xff1f;&#xff1f;&#xff1f; 1、Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。同时还可以被视为一种特殊的数据库&#xff0c;具体而言&#xff0c;它是一种分布式、面向文档的NoSQL数据库&#xff0c;专为全文搜索和数…

贪吃蛇游戏实现(VS编译环境)

贪吃蛇游戏 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C语言&#x1f353; &#x1f33c;文章目录&#x1f33c; 0. 前言 1. 游戏背景 2. 实现后游戏画面展示 3. 技术要求 4. Win32 API介绍 4.1 Win32 API 4.2 控制台程序 4.…

Java之类和对象

一面向对象的初步认知 1.什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的思想…

嵌入式物联网实战开发笔记-乐鑫ESP32开发环境ESP-IDF搭建【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;4e33 3.1 ESP-IDF 简介 ESP-IDF&#xff08;Espressif IoT Development Framework&#xff09;是乐鑫&#xff08;Espressif Systems&#xff09;为 ESP 系列…

如何用JS校验HTTP和HTTPS地址

在日常开发过程中&#xff0c;我们有时候对某些应用功能进行封装&#xff0c;但是在请求接口又不能写死&#xff0c;这个时候我们需要对他进行多方面考虑。 如何验证请求地址是HTTP还是HTTPS 方法一&#xff1a; function getBaseUrl (string) {let url;try {url new URL(s…

大型网站系统架构演化实例_2.使用缓存改善网站性能

1.使用缓存改善网站性能 网站访问的特点和现实世界的财富分配一样遵循二八定律&#xff1a;80%的业务访问集中在20%的数据上。既然大部分业务访问集中在一小部分数据上&#xff0c;那么如果把这一小部分数据缓存在内存中&#xff0c;就可以减少数据库的访问压力&#xf…

【Python】自定义修改pip下载模块默认的安装路径

因为电脑下载了Anaconda提供的默认Python 3.9 以及后期下载的python3.10所以在Pychram进行项目开发时&#xff0c;发现一些库怎么导入都导入不了&#xff0c;手动install也是失败&#xff0c;后期在cmd里面发现python以及pip配置有点儿混乱&#xff0c;导致执行命令时&#xff…

基于SpringCloudAlibaba+Sentinel的分布式限流设计

胡弦&#xff0c;视频号2023年度优秀创作者&#xff0c;互联网大厂P8技术专家&#xff0c;Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者&#xff0c;资深架构师&#xff0c;技术负责人&#xff0c;极客时间训练营讲师&#xff0c;四…

碳循环、人类、遥感之间的关联

1. 碳与碳循环 碳是自然界中很常见的一种元素&#xff0c;它以多种形式广泛存在于大气和地壳之中。碳单质很早就被人认识和利用&#xff0c;碳的一系列化合物——有机物是生命的根本。 1.1 自然界中的碳 地球上最大的两个碳库是岩石圈和化石燃料&#xff0c;含碳量约占…

小米K8s运维-云原生方向(面经分享)

大家好&#xff0c;我是秋意零。今天分享一篇小米运维面经。 小米K8s运维-云原生方向 一面 2024年4月3日 | 10点 | 一面 | 40 min 左右 1&#xff09;自我介绍 2&#xff09;你熟悉Python多一点吗&#xff1f;还熟悉其它语言吗&#xff0c;拿出来写过的&#xff1f; 3&am…

搜索引擎中的倒排索引是什么

在搜索引擎领域&#xff0c;倒排索引是一种核心数据结构&#xff0c;它让搜索引擎能够以极高的效率找到包含用户查询关键词的所有网页。为了理解倒排索引的工作原理&#xff0c;我们可以将其与一种更直观、生活化的例子相比较&#xff1a;书店里的索引卡片系统。 假设你是一位…

在RISC-V64架构的CV1811C开发板上应用perf工具进行多线程程序性能分析及火焰图调试

CV1811C环境编译 SDK目录结构 . ├── build // 编译目录,存放编译脚本以及各board差异化配置 ├── buildroot-2021.05 // buildroot开源工具 ├── freertos // freertos系统 ├── fsbl // fsbl启动固件,prebuilt形式存在…

K8s: 集群内Pod通信机制之环境变量

集群内Pod通信机制之环境变量 Kubernetes 支持两种基本的服务发现模式 —— 环境变量和 DNS 1 &#xff09; 环境变量概述 在Service里面通过label selector选择器去匹配到对应的pod然后把流量导给对应的pod进行这个service的一个服务提供也就是说你只要访问service的IP地址…

Android14 - WindowManagerService之客户端Activity布局

Android14 - WindowManagerService之客户端Activity布局 一、主要角色 WMS作为一个服务端&#xff0c;有多种客户端与其交互的场景。我们以常见的Activity为例&#xff1a; Activity&#xff1a;在ActivityThread构建一个Activity后&#xff0c;会调用其attach方法&#xff0c;…

【PyTorch】2-主要组成模块(数据读入、模型构建、损失函数、评价指标、训练和测试、优化器)

PyTorch&#xff1a;2-主要组成模块 注&#xff1a;所有资料来源且归属于thorough-pytorch(https://datawhalechina.github.io/thorough-pytorch/)&#xff0c;下文仅为学习记录 2.1&#xff1a;深度学习的必要部分 机器学习步骤 【1】数据预处理 【2】划分train、valid、…