⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myprintf.c

📁 小型的printf函数原码,省略了浮点数的支持,可明显减小原码大小.
💻 C
字号:
#include    "LPC2106.h"

void sendchar( int ch )
{
    while( (U1LSR&0x40)==0 );
    U1THR = ch;                   
}

static void printchar(char **str, int ch)
{
    if (str) 
    {
        **str = ch;
        ++(*str);
    }
    else
    { 
        (void)sendchar(ch);
    }
}

#define PAD_RIGHT 1
#define PAD_ZERO 2

static int prints(char **out, const char *string, int width, int pad)
{
    register int pc = 0, padchar = ' ';

    if (width > 0) 
    {
        register int lenn = 0;
        register const char *ptr;
        
        for (ptr = string; *ptr; ++ptr)
        { 
        ++lenn;
        }
        if (lenn >=width) 
        {
        width = 0;
        }
        else
        {
            width -= lenn;
        } 
        if (pad & PAD_ZERO) 
        {
        padchar = '0';
        }
    }
    if (!(pad & PAD_RIGHT)) 
    {
        for ( ; width > 0; --width)
        {
            printchar (out, padchar);
            ++pc;
        }
    }
    for ( ; *string; ++string)
    {
        printchar (out, *string);
        ++pc;
    }
    for ( ; width > 0; --width)
    {
        printchar (out, padchar);
        ++pc;
    }
    return pc;
}

#define PRINT_BUF_LEN 12

static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
{
    char print_buf[PRINT_BUF_LEN];
    register char *s;
    register int t, neg = 0, pc = 0;
    register unsigned int u = i;

    if (i == 0) 
    {
        print_buf[0] = '0';
        print_buf[1] = '\0';
        return prints (out, print_buf, width, pad);
    }
 
    if (sg && b == 10 && i < 0) 
    {
        neg = 1;
        u = -i;
    }

    s = print_buf + PRINT_BUF_LEN - 1;
    *s='\0';

    while (u) 
    {
        t = u % b;
        if( t >= 10 )
        t += letbase - '0' - 10;
        *--s = t + '0';
        u /= b;
    }

    if (neg) 
    {
        if( width && (pad & PAD_ZERO) ) 
        {
            printchar (out, '-');
            ++pc;
            --width;
        }
        else 
        {
            *--s = '-';
        }
    }

    return pc + prints (out, s, width, pad);
}


static int print(char **out, int *varg)
{
    register int width, pad;
    register int pc = 0;
    register char *format = (char *)(*varg++);
    char scr[2];

    for (; *format != 0; ++format) 
    {
        if (*format =='%') 
        {
            ++format;
            width = pad = 0;
            if (*format == '\0')
            { 
                break;
            }
            if (*format == '%') 
            {
                goto out;
            }
            if (*format == '-') 
            {
                ++format;
                pad =PAD_RIGHT;
            }
            while (*format == '0') 
            {
                ++format;
                pad |= PAD_ZERO;
            }
            for (; *format >= '0' && *format <= '9'; ++format) 
            {
                width *= 10;
                width += *format - '0';
            }
            if( *format == 's' ) 
            {
                register char *s = *((char **)varg++);
                pc += prints (out,s?s:"(null)", width, pad);
                continue;
            }
            if( *format == 'd' ) 
            {
                pc += printi (out, *varg++, 10, 1, width, pad, 'a');
                continue;
            }
            if( *format == 'x' ) 
            {
                pc += printi (out, *varg++, 16, 0, width, pad, 'a');
                continue;
            } 
            if( *format == 'X' ) 
            {
                pc += printi (out, *varg++, 16, 0, width, pad, 'A');
                continue;
            }
            if( *format == 'u' ) 
            {
                pc += printi (out, *varg++, 10, 0, width, pad, 'a');
                continue;
            }
            if( *format == 'c' ) 
            {
                scr[0] = *varg++;
                scr[1] = '\0';
                pc += prints (out, scr, width, pad);
                continue;
            }
        }
        else 
        {
            out:
            printchar (out, *format);
            ++pc;
        }
    }
    if (out) **out = '\0';
    return pc;
}


int printf(const char *format, ...)
{
    register int *varg = (int *)(&format);
    
    return print(0, varg);
}

int sprintf(char *out, const char *format, ...)
{
    register int *varg = (int *)(&format);
    
    return print(&out, varg);
}















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -