2013-06-02 123 views
0

我剛剛完成了C++完整參考,並且創建了一些測試類來更好地學習該語言。我已模擬了Java StringBuilder類和返回字符串是如下的方法中的第一類:C++字符串返回後垃圾

char *copy = new char[index]; 
register int i; 
for(i = 0; i <= index; i++) { 
    *(copy + i) = *(stringArray + i); 
} //f 

return copy; 

字符串數組是保持正被建造的字符串數組,索引代表的字符的量已被輸入。

當字符串返回時,它後面有一些垃圾,比如如果創建的字符串是abcd,那麼結果是abcd,後面跟着10個隨機字符。這些垃圾從哪裏來?如果您需要查看更多的代碼,請詢問。

+3

請注意,這裏沒有必要使用'register'(或者確實在任何地方......) –

+0

可能不是,本書只是建議使用register for for循環整數。 – Ghost

+1

'我<=索引'超出範圍 – billz

回答

1

您需要null來終止字符串。空字符告訴計算機什麼時候字符串結束。

char * copy = new char[ length + 1]; 
for(int i = 0; i < length; ++i) copy[i] = stringArray[i]; 
copy[length] = 0; //null terminate it 

只是幾件事。在最佳範圍內聲明int變量以實現良好實踐。這是一個很好的做法,所以不需要的範圍不會被填充,也更容易進行調試和記錄。放下'register'關鍵字,讓編譯器確定需要優化的內容。雖然register關鍵字只是暗示,除非你的代碼對性能非常嚴格,現在忽略類似的東西。

+0

感謝user814628,解決了它。 – Ghost

+0

@Ghost請記得「接受」解決您問題的答案。 –

0

索引是否包含要複製的字符串的長度,包括終止空字符?如果它不那麼那就是你的問題。

如果stringArrary不是以null結尾的 - 在某些情況下可以很好 - 您需要確保將空終止符附加到返回的字符串中,否則您沒有有效的C字符串,已經注意到,它後面會出現一堆「垃圾角色」。這實際上是一個緩衝區溢出,所以它不像看起來那麼無害。

你必須修改你的代碼如下:

char *copy = new char[index + 1]; 

和複製循環之後,你需要添加下面的代碼行添加空終止:

copy[index] = '\0'; 

一般來說,我建議使用strncpy()而不是手動循環來複制stringArray中的字符串 - 在大多數情況下,strncpy會被庫供應商優化以獲得最佳性能。儘管如此,您仍然必須確保生成的字符串是空的。

+0

我試過index + 1,但那不起作用。圍繞它的正確方法是什麼?存儲在裏面的字符串的長度通常比索引長。 – Ghost