簡體   English   中英

為什么在strcpy可以的情況下,新字符串上的strcat()在一開始就清除未定義的字符?

[英]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 連接字符串; 這意味着它將合並postmp的內容。 在調用strcat之前pos包含什么? 是否已定義?

不要使用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 )對於錯誤檢查工作至關重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM