自己写printf函数,遇到问题。请大家帮忙瞧瞧~

2020-02-09 09:16发布

没写完呢。现在只是printf(0,0,0,"汉字ABC字母好使");这样的好使

char a = 'a';
然后如果printf(0,0,0,"A is %c", a);在LCD上显示这中的话,就找不到a这个参数。

我怀疑也是指针的问题,但是我想不出来哪的问题了!!

请大虾们帮我看看~


void printf(U8 addx, U8 addy, U8 mode, const rom char * format, ...)
{
        char cTemp;
        U8 posX = addx;
        U8 posY = addy;
        va_list ap;
        va_start(ap, mode);

        for(cTemp = *format; cTemp; cTemp = *++format)
        {
                if(cTemp == '%')//特殊格式符
                {
                        cTemp = *++format;
                        switch(cTemp)
                        {
                                case 'd'://10进制有符号整数
                                        break;
                                case 'u'://10进制无符号整数
                                        break;
                                case 'x'://16进制无符号整数
                                case 'X':
                                        showNum(posX, posY, mode, '0');
                                        updatePos(&posX, &posY, 1);
                                        showNum(posX, posY, mode, 'x');
                                        updatePos(&posX, &posY, 1);
                                        break;
                                case 'f'://浮点数
                                case 'F':
                                        break;
                                case 'c'://单个字符,指字母和数字,标点
                                        {
                                                char temp = va_arg(ap, char);//这个地方找不到下一个参数,跟踪仿真的时候temp都等于0x00
                                                showNum(posX, posY, mode, temp);
                                                updatePos(&posX, &posY, 1);
                                        }
                                        break;
                                case 's'://字符串,半角
                                        break;
                                case 'S'://宽字符,全角,指汉字
                                        break;
                        }
                }
                else if(cTemp == '/')//打印特殊符号
                {
                       
                }
                else//不是格式符
                {
                        cTemp = *++format;
                        if(cTemp > 0x80)//说明是个汉字
                        {
                                U16 hz1 = 0;
                                U16 hz2 = 0;
                                format--;
                                hz1 = cTemp & 0xff;//必须这么写,否则计算错误
                                hz2 = *format & 0xff;
                                hz1 = (hz1 << 8);
                                hz1 = hz1 & 0xff00 | hz2;
                                showChnn(posX, posY, mode, hz1);
                                format++;
                                updatePos(&posX, &posY, 2);//因为是汉字所以占用两个8位
                        }
                        else//说明是个字母或者符号
                        {
                                cTemp = *--format;
                                showNum(posX, posY, mode, cTemp);
                                updatePos(&posX, &posY, 1);//字母或者符号占用1位
                        }       
                }
        }
        va_end(ap);
        //返回长度
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
zkyu
1楼-- · 2020-02-09 11:18
是用在哪个片子上的? 如果是C30 C32编译器 库里面是有这个函数的
backup
2楼-- · 2020-02-09 17:17
这里需要的是const rom char *类型,你给给char类型肯定不行了。这样修改后试试:
char a[10]= "a";
backup
3楼-- · 2020-02-09 20:05
sprintf函数很好用。
先用sprintf把要输出的内容格式化成字符串,而后根据具体设备输出字符即可,非常方便,代码的移植也很方便。
你试试?
ddwl99
4楼-- · 2020-02-10 00:25
 精彩回答 2  元偷偷看……
ddwl99
5楼-- · 2020-02-10 06:24
终于搞定了。原来是因为变参的话,他就每个参数都默认为是INT型的。所以%c才会打不出来,他就剩下高8位了。

一周热门 更多>