为什么新的字符串上的strcat()在strcpy没问题的时候会在开头剔除未定义的字符?

时间:2010-07-30 09:48:48

标签: c

例如

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);

不太好。

3 个答案:

答案 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 连接字符串;这意味着它合并了postmp的内容。在致电pos之前,strcat包含哪些内容?是否定义了?

答案 2 :(得分:1)

请勿使用strcattmp。你写的是无意义的过于复杂和低效的代码。代替:

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)对于错误检查工作至关重要。