[英]Why does strcat() on a new string craps out undefined characters in the beginning while strcpy is ok?
例如
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);
不好
strcat()
函數期望目標參數已經包含正確以null終止的字符串。 在您的情況下,聽起來pos
包含一些垃圾,這些垃圾看起來像是一個以null終止的字符串,但不是您所期望的。 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);
strcat
連接字符串; 這意味着它將合並pos
和tmp
的內容。 在調用strcat
之前pos
包含什么? 是否已定義?
不要使用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
)對於錯誤檢查工作至關重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.