打印

sprintf应用中,输出到缓冲区的数值怎么不正确?邀请各位大

[复制链接]
3614|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xf.zhu|  楼主 | 2007-12-11 08:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"
#include <stdio.h>


unsigned int     va,vb,vc,ca,cb,cc,dat0,dat1,dat2,dat3;
unsigned long     pa,pb,pc,pt,Qa,Qb,Qc,Qt;
unsigned char idata    buf[50];

main()
{
    unsigned char    i,Year,Month,Day,Hour,Minute;

    while ( 1 )
    {
            va=vb=vc=ca=cb=cc=999;
            i=sprintf(buf,"%2x-%2x-%2x,%2x:%2x,",(unsigned int)(Year),(unsigned int)(Month),(unsigned int)(Day),(unsigned int)(Hour),(unsigned int)(Minute));
            i+=sprintf(buf+15,"%3u,%3u,%3u,%3u,%3u,%3u,",va,vb,vc,ca,cb,cc);

            pa=pb=pc=pt=Qa=Qb=Qc=Qt=999999;
//            i=sprintf(buf,"%6lu,%6lu,%6lu,",(pa&0x000fffff),(pb&0x000fffff),(pc&0x000fffff));
            i=sprintf(buf,"%6lu,%6lu,%6lu,",999999,999999,999999);
            i+=sprintf(buf+21,"%6lu,%6lu,%6lu,",(pt&0x000fffff),(Qa&0x000fffff),(Qb&0x000fffff));

            dat0=2000;
            dat1=2000;
            dat2=2000;
            dat3=2000;
            i=sprintf(buf,"%6lu,%6lu,",(Qc&0x000fffff),(Qt&0x000fffff));
            i+=sprintf(buf+14,"%4u,%4u,%4u,%4u ",dat0,dat1,dat2,dat3);
    }
}

相关帖子

沙发
infree| | 2007-12-11 10:24 | 只看该作者

劝你仔细一点

我帮你测试了一下这个程序,没看到什么输出不正确的地方。
只有觉得你有两个不太认真的地方:
1. Year,Month,Day,Hour,Minute没有初值化,你想让它输出什么样的值呢?
2. 发帖时说得不清楚,你到底碰到什么样的问题,到底是哪一条语句执行不正确还是所有的sprintf执行都不正确?是什么样的一个不正确的现象最好都说明白些,这些大家就可以轻易入手忙你解决问题。否则可能只有我这样的闲人才有兴趣替你看程序了。

使用特权

评论回复
板凳
xf.zhu|  楼主 | 2007-12-11 10:54 | 只看该作者

re:

Year,Month,Day,Hour,Minute的初值暂且不管,后边999999输出到数组中对吗?我这里仿真的结果是999999,999999,787968,999999,999999,787968, 不知道您仿真的结果是多少?

使用特权

评论回复
地板
xf.zhu|  楼主 | 2007-12-11 11:01 | 只看该作者

如图所示:不明白为什么值错误

使用特权

评论回复
5
infree| | 2007-12-11 12:52 | 只看该作者

是不是你的编译模式设置有问题呵

我仿真没有这个问题,是不是你的内存模式设置的不对,我的是设置成了large.

使用特权

评论回复
6
xf.zhu|  楼主 | 2007-12-11 12:59 | 只看该作者

我选择的是small

使用特权

评论回复
7
xf.zhu|  楼主 | 2007-12-11 13:34 | 只看该作者

看到参数字节数量有限制,可是我这个也没超限!

使用特权

评论回复
8
infree| | 2007-12-12 10:23 | 只看该作者

你对参数的理解不对

参数字节数应包括sprintf的前两个参数(通用指针,各占3字节)。
http://www.keil.com/support/docs/99.htm

使用特权

评论回复
9
xf.zhu|  楼主 | 2007-12-12 11:16 | 只看该作者

多谢 infree!

使用特权

评论回复
10
mohanwei| | 2007-12-12 11:53 | 只看该作者

很明显的逻辑错误

例如你的原程序里:
i=sprintf(buf,"%6lu,%6lu,%6lu,",999999,999999,999999);       i+=sprintf(buf+21,"%6lu,%6lu,%6lu,",(pt&0x000fffff),(Qa&0x000fffff),(Qb&0x000fffff));


你可能是想把N个参数格式化成1个字符串,但是你怎么知道前面第一次输出了21个字符呢?如果你想%6LU,实际上这个无符号长整数是12345678呢?显然输出的字符超过了6个。

应该这样: 
i=sprintf(buff, ...);//第一次
i += sprintf(buff+i, ...);//第二次
i += sprintf(buff+i, ...);//第三次
……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

136

帖子

1

粉丝