请教各位网友,sprintf函数问题

[复制链接]
1506|16
手机看帖
扫描二维码
随时随地手机跟帖
xbyu520|  楼主 | 2016-7-26 10:57 | 显示全部楼层 |阅读模式
相邻的sprintf()函数之间需要请内存空间吗?
例如unsigned char buf[330]={0};
sprintf(buf,"PS16(1,90,118,'%c%c.%c%cA',17,0);\r\n",*(p+1),*(p+2),*(p+3),*(p+4));   
SendStr(buf);
sprintf(buf,"PS16(1,90,118,'%c%c.%c%cA',17,0);\r\n",*(p+1),*(p+2),*(p+3),*(p+4));   
SendStr(buf);
在两个sprintf()之间需要插入清buf的代码吗?为什么?

相关帖子

ayb_ice| | 2016-7-26 11:34 | 显示全部楼层
不是必须,但是个好的习惯

使用特权

评论回复
xbyu520|  楼主 | 2016-7-26 11:48 | 显示全部楼层
ayb_ice 发表于 2016-7-26 11:34
不是必须,但是个好的习惯

师傅你好,你的意思我理解。我想知道sprintf函数的实现细节,系统是不是自己已经替我们做了,有没有必要再由用户来清

使用特权

评论回复
aozima| | 2016-7-26 11:57 | 显示全部楼层
sprintf不会写入'\0',所以要根据返回的写入长度自己清0。

使用特权

评论回复
xbyu520|  楼主 | 2016-7-26 12:26 | 显示全部楼层
aozima 发表于 2016-7-26 11:57
sprintf不会写入'\0',所以要根据返回的写入长度自己清0。

你的意思是需要清buf数组吗?

使用特权

评论回复
xbyu520|  楼主 | 2016-7-26 12:27 | 显示全部楼层
/*------------------------------------------------
                   发送一个字符
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF0 = dat;
while(!TI0);
  TI0=0;
}
/*------------------------------------------------
                   发送一个字符串(只能发送字符串)
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')                // \0表示字符串结束标志
                                                                                //通过检测是否字符串末尾
  {
                SendByte(*s);
                s++;
  }
}        这两个函数,是和上面的代码配合 的

使用特权

评论回复
ayb_ice| | 2016-7-26 14:05 | 显示全部楼层
xbyu520 发表于 2016-7-26 11:48
师傅你好,你的意思我理解。我想知道sprintf函数的实现细节,系统是不是自己已经替我们做了,有没有必要 ...

也有可能是插入结束符的意思

使用特权

评论回复
xbyu520|  楼主 | 2016-7-26 14:31 | 显示全部楼层
ayb_ice 发表于 2016-7-26 14:05
也有可能是插入结束符的意思

怎么看sprintf的源码?“也有可能是插入结束符的意思”是什么意思?

使用特权

评论回复
xbyu520|  楼主 | 2016-7-26 14:41 | 显示全部楼层
经过实际测试,不需要清。。当然清了也可以。(只是有点多余)

使用特权

评论回复
xbyu520|  楼主 | 2016-7-26 14:48 | 显示全部楼层
这是在51单片机keil中的单步执行的截图  
QQ截图20160726144313.png
QQ截图20160726144343.png
QQ截图20160726144407.png
QQ截图20160726144435.png
QQ截图20160726144508.png
QQ截图20160726144602.png

使用特权

评论回复
xbyu520|  楼主 | 2016-7-26 15:35 | 显示全部楼层
收回10楼的帖子,在遇到不定长的往buf里写数据时,会出现没有清之前的 数据的情况。看来还是要程序员手动清buf

使用特权

评论回复
ayb_ice| | 2016-7-26 16:33 | 显示全部楼层
xbyu520 发表于 2016-7-26 14:31
怎么看sprintf的源码?“也有可能是插入结束符的意思”是什么意思?

就是结束符0,先全部写了,最后不用再插入0了,因为是可变长度的数据,最后插入0比较麻烦

使用特权

评论回复
xbyu520|  楼主 | 2016-7-26 18:20 | 显示全部楼层
本帖最后由 xbyu520 于 2016-7-26 18:21 编辑
ayb_ice 发表于 2016-7-26 16:33
就是结束符0,先全部写了,最后不用再插入0了,因为是可变长度的数据,最后插入0比较麻烦 ...

哦,我懂了。单步调试的时候,已经发现printf就是会在末尾加入0x00   非常感谢您!  看样子在两个sprintf之间,还是需要自己写个清数组的函数

使用特权

评论回复
松哥无敌| | 2016-7-26 21:26 | 显示全部楼层

使用特权

评论回复
mohanwei| | 2016-7-26 22:06 | 显示全部楼层
aozima 发表于 2016-7-26 11:57
sprintf不会写入'\0',所以要根据返回的写入长度自己清0。

你这是误导人啊……
sprintf很庞大,在不同的编译器里实现不同(有的会支持更多的格式,体积也会更大),但是肯定都会在字符串末尾加个0x00作为结束符
可以参考一下linux、MFC的源码

使用特权

评论回复
aozima| | 2016-7-26 22:46 | 显示全部楼层
mohanwei 发表于 2016-7-26 22:06
你这是误导人啊……
sprintf很庞大,在不同的编译器里实现不同(有的会支持更多的格式,体积也会更大), ...

罪过

使用特权

评论回复
shauew| | 2016-7-27 08:40 | 显示全部楼层
mohanwei 发表于 2016-7-26 22:06
你这是误导人啊……
sprintf很庞大,在不同的编译器里实现不同(有的会支持更多的格式,体积也会更大), ...

果然各种编译器的移植需要注意的事蛮多的

使用特权

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

本版积分规则

41

主题

847

帖子

5

粉丝