例如
sprintf(pos,"%f ",cl.snap.ps.origin[0]); //don't start with strcat
sprintf(tmp,"%f ",cl.snap.ps.origin[1]);strcat(pos, tmp);
细
与
sprintf(tmp,"%f ",cl.snap.ps.origin[0]);strcat(pos, tmp);
sprintf(tmp,"%f ",cl.snap.ps.origin[1]);strcat(pos, tmp);
不太好。
答案 0 :(得分:5)
strcat()
函数期望destination参数已包含正确的以null结尾的字符串。在你的情况下,听起来像pos
包含一些看起来的垃圾,就像一个以空字符结尾的字符串,但不是你所期望的。 strcat()
尽职尽责地追加到那个垃圾的末尾。
解决此问题的一种方法是在代码之前初始化pos
:
pos[0] = '\0';
sprintf(tmp,"%f ",cl.snap.ps.origin[0]);strcat(pos, tmp);
sprintf(tmp,"%f ",cl.snap.ps.origin[1]);strcat(pos, tmp);
答案 1 :(得分:3)
strcat
连接字符串;这意味着它合并了pos
和tmp
的内容。在致电pos
之前,strcat
包含哪些内容?是否定义了?
答案 2 :(得分:1)
请勿使用strcat
和tmp
。你写的是无意义的过于复杂和低效的代码。代替:
pos+=sprintf(pos,"%f ",cl.snap.ps.origin[0]);
pos+=sprintf(pos,"%f ",cl.snap.ps.origin[1]);
...
除非您确定sprintf
不能失败,而不是直接将返回值添加到pos
,否则您应该首先将返回值存储在单独的int
变量中并检查它不是-1。
最好使用snprintf
来确保不会溢出缓冲区:
size_t cnt, rem=your_buffer_size;
cnt=snprintf(pos, rem,"%f ",cl.snap.ps.origin[0]);
if (cnt>=rem) goto error;
pos+=cnt; rem-=cnt;
cnt=snprintf(pos, rem,"%f ",cl.snap.ps.origin[1]);
if (cnt>=rem) goto error;
pos+=cnt; rem-=cnt;
...
请注意,cnt
是无符号类型(size_t
)对于错误检查工作至关重要。