【C语言】十进制,十六进制,浮点数转换成字符串,实现printf函数(串口打印)

 注意:在ecplise下使用CDT开发C/C++程序中,使用debug调试时,到了printf 打印函数,在console窗口中并没有打印出信息来,停止后才会有输出。原因是:在debug调试时, eclipse 将输出的内容存放到了输出缓存区中,没有及时的输出到控制台。等到调试结束时,再将所有的信息一并打印出来。

解决方法:推荐使用:在程序开始时设置缓冲区类型,setvbuf函数在stdio.h文件声明。

setvbuf(stdout,NULL,_IONBF,0);

函数原型:

函数名: setvbuf

头文件:stdio.h
用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size);
type : 期望缓冲区的类型:
_IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
_IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size : 缓冲区内字节的数量。

代码如下: 


#include <stdio.h>
#include <stdarg.h>
#include <string.h>

#define SELECT_RECURSION_ALG

int Decimal2Str(int in, char *str)
{
    int mod, div;
    int sign = 0;
    char buf[100] = {0};
    int offset = sizeof(buf) - 1;
    char *pos = buf + offset;

    *(pos--) = '\0';

    sign = (in < 0) ? -1 : 1;
    div  = sign * in;

    do{
        mod = div % 10;
        div = div / 10;
        *(pos--) = '0' + mod;
    }while(div != 0);

    if( in < 0 ) *(pos--) = '-';
    memcpy(str, pos + 1, strlen(pos + 1));
    return strlen(pos + 1);
}

int Hex2Str(int in, char *str)
{
#ifndef SELECT_RECURSION_ALG
    int mod, div;
    int sign = 0;
    char buf[100] = {0};
    int offset  = sizeof(buf) - 1;
    char *pos = buf + offset;

    if(in < 0) return 0;

    *(pos--) = '\0';
    div = in;
    do{
        mod = div % 16;
        div = div / 16;
        if(mod > 9)
            *(pos--) = '7' + mod;
        else
            *(pos--) = '0' + mod;
    }while(div != 0);

    memcpy(str, pos + 1, strlen(pos + 1));

    return strlen(pos + 1);
#else
    int index = 0;
    if(0 >= in) return index;
    int mod = in % 16, div = in / 16;
    index += Hex2Str(div, str);
    if(mod > 9)
        *(str + index++) = mod + '7';
    else
        *(str + index++) = mod + '0';

    return index;
#endif
}

int Float2Str(double in, char *str)
{
    int integer = (int)in;
    int index = Decimal2Str(integer, str);
    *(str + index++) = '.';
    double fractional = in - integer;
    int fractional2Integer = (int)(fractional * 1000000);
    index += Decimal2Str(fractional2Integer, str + index);
    return index;
}

int Decimal2BinaryStr(int in, char *str)
{
    int index = 0;
    if(0 == in) return index;

    index += Decimal2BinaryStr(in / 2, str);
    *(str + index++) = (char)(in % 2) + '0';

    return index;
}

void MyPrintf(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    char buf[256] = {0};
    int index = 0;
    int i = 0;
    while(*fmt)
    {
        if(*fmt != '%')
        {
            buf[index++] = *fmt;
        }
        else
        {
            switch(*(++fmt))
            {
                case 'b':
                case 'B':
                {
                    int d = va_arg(args, int);
                    int l = Decimal2BinaryStr(d, buf + index);
                    index += l;
                    break;
                }
                case 'c':
                case 'C':
                {
                    char c = va_arg(args, int);
                    buf[index++] = c;
                    break;
                }
                case 'f':
                case 'F':
                {
                    double f = va_arg(args, double);
                    int l = Float2Str(f, buf + index);
                    index += l;
                    break;
                }
                case 'd':
                case 'D':
                {
                    int d = va_arg(args, int);
                    int l = Decimal2Str(d, buf + index);
                    index += l;
                    break;
                }
                case 'x':
                case 'X':
                {
                    int h = va_arg(args, int);
                    int l = Hex2Str(h, buf + index);
                    index += l;
                    break;
                }
                case 's':
                case 'S':
                {
                    char *s = va_arg(args, char *);
                    strcpy(buf + index , s);
                    index += strlen(s);
                    break;
                }
                default:
                    printf("dont support\n");
                    break;
            }
        }
        fmt++;
    }
    buf[index++] = '\0';
    va_end(args);

    for(i = 0; i < index; ++i)
    {
        putchar(buf[i]);
    }
}


void MyNewPrintf(const char *fmt, ...)
{
    va_list ap;//定义一个指针变量
    unsigned int size = 0;
    char buf[256] = {0};

    va_start(ap, fmt);
    size = vsnprintf(buf, sizeof(buf), fmt, ap);
    va_end (ap);
    for(int i = 0; i < size; ++i)
    {
        putchar(buf[i]);
    }
}

int main(int argc, char *argv[])
{
    printf("=============> MyPrintf <================\n");
    int a = -1;
    if(a < 0) printf("this is -1 < 0 %d\n", 1);
    else printf("this is -1 > 0 %d\n", 0);
//  MyPrintf("test char %c\n", 'd');
//  MyPrintf("test data0 %d\n", 0);
//  MyPrintf("test data5 %d\n", 5);
//  MyPrintf("test data10 %d\n", 10);
//  MyPrintf("test data100 %d\n", 100);
    MyPrintf("test data999 %d\n", 999);
    MyPrintf("test data-999 %d\n", -999);
//  MyPrintf("test data-0 %d\n", -0);

    MyPrintf("test data0x999 0x%x\n", 0x999);
    MyPrintf("test data0x888888 0x%x\n", 0x888888);
    MyPrintf("test data0xA8C8F8 0x%x\n", 0xA8C8F8);
    MyPrintf("test data200 0x%x\n", 200);

    MyPrintf("test data0x888888 %s\n", "data0x888888");
    MyPrintf("test data12345678.1234567 %f data0xA8C8F8 0x%x\n", 12345678.1234567, 0xA8C8F8);
    MyPrintf("test data5 0b%b 0b%b\n", 5, 0xA);

    printf("=============> MyNewPrintf <================\n");
    MyNewPrintf("test data999 %d\n", 999);
    MyNewPrintf("test data-999 %d\n", -999);
//  MyNewPrintf("test data-0 %d\n", -0);

    MyNewPrintf("test data0x999 0x%x\n", 0x999);
    MyNewPrintf("test data0x888888 0x%x\n", 0x888888);
    MyNewPrintf("test data0xA8C8F8 0x%x\n", 0xA8C8F8);
    MyNewPrintf("test data200 0x%x\n", 200);

    MyNewPrintf("test data0x888888 %s\n", "data0x888888");
    MyNewPrintf("test data12345678.1234567 %f data0xA8C8F8 0x%x\n", 12345678.1234567, 0xA8C8F8);
    return 0;
}

打印结果:

=============> MyPrintf <================
this is -1 < 0 1
test data999 999
test data-999 -999
test data0x999 0x999
test data0x888888 0x888888
test data0xA8C8F8 0xA8C8F8
test data200 0xC8
test data0x888888 data0x888888
test data12345678.1234567 12345678.123456 data0xA8C8F8 0xA8C8F8
test data5 0b101 0b1010
=============> MyNewPrintf <================
test data999 999
test data-999 -999
test data0x999 0x999
test data0x888888 0x888888
test data0xA8C8F8 0xa8c8f8
test data200 0xc8
test data0x888888 data0x888888
test data12345678.1234567 12345678.123457 data0xA8C8F8 0xa8c8f8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值