简单的printf函数实现
来源:互联网 发布:js函数式编程是什么 编辑:程序博客网 时间:2024/06/02 21:26
源码如下:
#include<stdio.h>
#include<stdarg.h>
#include "myprintf.h"
long int mypow(int a,int n)
{
long int result=1;
int i=0;
for(;i<n;i++)
result=result*a;
return result;
}
int float2str(char *s,float a,int len1,int len2)//float 转换成字符串
{
int b;
int i,d,j=0;
b=(int)a;
if(b<0)//判断正负
{
s[0]='-';
j=1;
b=-b;
}
for(i=j;i<len1+j;i++)
s[i]='0'+(b/(int)mypow(10,len1+j-i-1))%10;
s[len1+j]='.';
d=(int)((-a-b)*(int)mypow(10,len2));
for(i=0;i<len2;i++)
s[i+len1+j+1]='0'+(d/(int)mypow(10,len2-i-1))%10;
s[len1+len2+1+j]='/0';
return len1+len2+1+j;
}
char *itoa(int value, char *string, int radix)//整数转换成字符串
{
int i, d;
int flag = 0;
char *ptr = string;
if (radix != 10)
{
*ptr = 0;
return string;
}
if (!value)
{
*ptr++ = 0x30;
*ptr = 0;
return string;
}
if (value < 0)
{
*ptr++ = '-';
value *= -1;
}
for (i = 10000; i > 0; i /= 10)
{
d = value / i;
if (d || flag)
{
*ptr++ = (char)(d + 0x30);
value -= (d * i);
flag = 1;
}
}
*ptr = 0;
return string;
}
int IntoBHex(int a,char *str,int radix)//整数转换成16进制或2进制
{
int i=0,j=0,temp=a;
unsigned char mask=0;
if(2==radix)
{
if(0==temp)
{
str[0]='0';
str[1]='/0';
return 2;
}
for(;i<sizeof(int)*8;i++)
{
if(temp&(0x80000000>>i))
str[i]='1';
else
str[i]='0';
}
str[i]='/0';
return i;
}
if(16==radix)
{
str[0]='0';
str[1]='x';
for(i=sizeof(int)*2-1;i>=0;i--,j++)
{
mask=(temp)>>(i*4);
mask=mask&0x0f;
if (mask<=9) {
str[j+2]='0'+mask;
}
else
{
str[j+2]='A'+mask-10;
}
}
str[j+2]='/0';
return j+2;
}
}
void myprintf(const char *fmt, ...)
{
const char *s;
int d,i;
int x,len;
float f;
char buf[35],flag=1;/*flag用于判断'0'是否要输出*/
va_list ap;
va_start(ap, fmt);
while (*fmt) {
if (*fmt != '%')
{
putchar(*fmt++);
continue;
}
switch (*++fmt) {
case 's':
s = va_arg(ap, const char *);
for ( ; *s; s++) {
printfchar(*s);
}
break;
case 'd':
case 'D':
d = va_arg(ap, int);
itoa(d, buf, 10);
for (s = buf; *s; s++) {
printfchar(*s);
}
break;
case 'x':
case 'X':
x = va_arg(ap, int);
len=IntoBHex(x, buf, 16);
flag=1;
for (i=0; i<len;i++) {
if(buf[i]!='0'||flag)
{
printfchar(buf[i]);
flag=1;
}
}
break;
case 'b':
case 'B':
x = va_arg(ap, int);
len=IntoBHex(x, buf, 2);
flag=0;
for (i=0; i<len;i++) {
if(8==len-i)
flag=1;
if(buf[i]!='0'||flag)
{
printfchar(buf[i]);
flag=1;
}
}
break;
case 'f':
case 'F':
f = va_arg(ap, double);
len=float2str(buf,f, 10, 6);
flag=0;
for (i=0; i<len;i++) {
if(buf[i]!='0'||flag)
{
printfchar(buf[i]);
if(buf[i]!='-')
flag=1;
}
}
flag=1;
break;
case 'c':
case 'C':
x = va_arg(ap,int);
putchar(x);
break;
default:
printfchar(*fmt);
break;
}
fmt++;
}
va_end(ap);
return ;
}
int main()
{
char *s="hello,world";
int a=1000,b=-100;
char c='b';
double f=-22.5;
myprintf("f=%f/na=%b/nb=%x/n c=%c b=%d",f,a,b,c,b);
return 1;
}
- 简单的printf函数实现
- 实现简单的printf函数
- 简单实现printf函数
- printf函数的简单模拟实现
- 自己实现的简单Printf函数
- printf 的简单实现
- Printf()函数简单实现
- 简单模拟实现printf函数
- printf 函数的实现 *
- printf函数的实现
- printf函数的实现
- 不使用man 3 printf的函数,实现一个简单的printf函数
- 可变参数列表:简单printf函数的实现
- printf 函数的实现原理
- 实现自己的printf函数
- printf 函数的实现原理
- 实现自己的printf函数
- printf 函数的实现原理
- Copy文件之前先用有權限的账号登陆,然后用此账号操作
- 操作系统调度算法
- 如何设计网页?快速制作网页秘诀!
- 如何使域用户具有本机管理员权限?
- 再论 Java 应用中的“领域建模”
- 简单的printf函数实现
- 二维地图怎样运用到自己的网站上
- 彻底搞清JavaScript的变量作用域
- 条件导出
- 中3班09年3月份学习重点
- 新的开始
- ActionScript中的Function和Constructor不能overload
- gzip解压和压缩
- ( System.Reflection.Assembly.GetEntryAssembly() ).Location 路径解析