1 #ifndef __PRINT_H_
2 #define __PRINT_H_
3
4 void print(char* fmt, ...);
5 void printch(char ch);
6 void printdec(int dec);
7 void printflt(double flt);
8 void printbin(int bin);
9 void printhex(int hex);
10 void printstr(char* str);
11
12 #define console_print(ch) putchar(ch)
13
14 #endif /*#ifndef __PRINT_H_*/
#include
2 #include
3 #include "print.h"
4
5 int main(void)
6 {
7 print("print: %c\n", 'c');
8 print("print %d\n", 1234567);
9 print("print: %f\n", 1234567.1234567);
10 print("print: %s\n", "string test");
11 print("print: %b\n", 0x12345ff);
12 print("print: %x\n", 0xabcdef);
13 print("print: %%\n");
14 return 0;
15 }
16
17 void print(char* fmt, ...)
18 {
19 double vargflt = 0;
20 int vargint = 0;
21 char* vargpch = NULL;
22 char vargch = 0;
23 char* pfmt = NULL;
24 va_list vp;
25
26 va_start(vp, fmt);
27 pfmt = fmt;
28
29 while(*pfmt)
30 {
31 if(*pfmt == '%')
32 {
33 switch(*(++pfmt))
34 {
35
36 case 'c':
37 vargch = va_arg(vp, int);
38 /* va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
39 mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
40 printch(vargch);
41 break;
42 case 'd':
43 case 'i':
44 vargint = va_arg(vp, int);
45 printdec(vargint);
46 break;
47 case 'f':
48 vargflt = va_arg(vp, double);
49 /* va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
50 mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
51 printflt(vargflt);
52 break;
53 case 's':
54 vargpch = va_arg(vp, char*);
55 printstr(vargpch);
56 break;
57 case 'b':
58 case 'B':
59 vargint = va_arg(vp, int);
60 printbin(vargint);
61 break;
62 case 'x':
63 case 'X':
64 vargint = va_arg(vp, int);
65 printhex(vargint);
66 break;
67 case '%':
68 printch('%');
69 break;
70 default:
71 break;
72 }
73 pfmt++;
74 }
75 else
76 {
77 printch(*pfmt++);
78 }
79 }
80 va_end(vp);
81 }
82
83 void printch(char ch)
84 {
85 console_print(ch);
86 }
87
88 void printdec(int dec)
89 {
90 if(dec==0)
91 {
92 return;
93 }
94 printdec(dec/10);
95 printch( (char)(dec%10 + '0'));
96 }
97
98 void printflt(double flt)
99 {
100 int icnt = 0;
101 int tmpint = 0;
102
103 tmpint = (int)flt;
104 printdec(tmpint);
105 printch('.');
106 flt = flt - tmpint;
107 tmpint = (int)(flt * 1000000);
108 printdec(tmpint);
109 }
110
111 void printstr(char* str)
112 {
113 while(*str)
114 {
115 printch(*str++);
116 }
117 }
118
119 void printbin(int bin)
120 {
121 if(bin == 0)
122 {
123 printstr("0b");
124 return;
125 }
126 printbin(bin/2);
127 printch( (char)(bin%2 + '0'));
128 }
129
130 void printhex(int hex)
131 {
132 if(hex==0)
133 {
134 printstr("0x");
135 return;
136 }
137 printhex(hex/16);
138 if(hex < 10)
139 {
140 printch((char)(hex%16 + '0'));
141 }
142 else
143 {
144 printch((char)(hex%16 - 10 + 'a' ));
145 }
146 }
Linux内核中的printf实现【转】
转自:http://www.cnblogs.com/chenglei/archive/2009/08/06/1540702.html 从main.c中的printf开始读这个函数. 首先看printf ...
Linux内核中双向链表的经典实现
概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核 ...
(十)Linux内核中的常用宏container_of
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...
Linux内核中的常用宏container_of
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...
linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)
学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从 ...
linux内核中的排序接口--sort函数
linux内核中的sort函数,其实跟我们所说的qsort函数很像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t wi ...
C语言在linux内核中do while(0)妙用之法
为什么说do while(0) 妙?因为它的确就是妙,而且在linux内核中实现是相当的妙,我们来看看内核中的相关代码: #define db_error(fmt, ...) \ do { \ fpr ...
Linux内核中的常用宏container_of其实很简单【转】
转自:http://blog.csdn.net/npy_lp/article/details/7010752 开发平台:Ubuntu11.04 编 译器:gcc version 4.5.2 (Ubun ...
Linux内核中的信号机制--一个简单的例子【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...
随机推荐
Java集合框架中List接口的简单使用
Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...
shell script 的追踪与 debug
shell script 的追踪与 debug scripts 在运行之前,最怕的就是出现语法错误的问题了!那么我们如何 debug 呢?有没有办法不需要透过直接运行该 scripts 就可以来判断是 ...
深入浅出数据结构C语言版(20)——快速排序
正如上一篇博文所说,今天我们来讨论一下所谓的"高级排序"--快速排序.首先声明,快速排序是一个典型而又"简单"的分治的递归算法. 递归的威力我们在介绍插入排序时 ...
chm 转 txt
CHM格式转TXT,如果在Windows下可使用命令行实现,为叙述方便,以笔者机器为例,在 E:\11 文件夹下有 123.chm 这个文件,按如下操作将这个 CHM 转成 TXT 文件. 第一步: ...
20164305 徐广皓 Exp5 MSF基础应用
一.知识点总结 二.攻击实例 主动攻击的实践 ms08_067(win7) payload/generic/shell_reverse_tcp(失败) payload/windows/meterpre ...
播放器: AVPlayer
AVPlayer *player = [AVPlayer playerWithURL:[NSURL URLWithString:@"http://flv2.bn.netease.com/vi ...
yii2 basic版本的一些配置
1.nginx配置 重写规则 修改访问模式为 http://wh.store/admin/index 文件位置: /home/wwwroot/default/yii2-app-basic/config ...
DP-hdu1260
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 题目描述: 题目大意:每一个人去电影票买票,有两种买票方法:1.自己单人买:2.与前面的人一起买 ...
day64_SpringMVC学习笔记_02
1.springmvc对多视图的支持 (1)导入xml格式视图支持的jar包 注意:springmvc本身就支持xml格式,所以不用导入其他支持的jar包了. (2)在springmvc.xml中 ...
〖Linux〗Kubuntu文件管理器单例的设置(即:一个工作区只一个文件管理器)
有没有一种,情况: 1. 程序A打开了文件管理器: 2. 程序B又打开了文件管理器: 导致开了两个文件管理器,太不舒服了: 搜索下 kubuntu dolphin single instance,果然 ...