2012-08-06 87 views
6

現在讓我們看看這個小程序C++:是否strcat()覆蓋或移動null?

char s[20]="One"; 
strcat(s,"Two"); 
cout<<s<<endl; 

在這裏,在第一S具有值「一」和用於視覺表示這是s的值:

-O - N - ë - \ 0

然後,添加 「二」 到字符串的結尾產生這樣的:

Ø - N - Ë - T - w^- O - \ 0

現在你可以看到字符串中唯一的空字符在「One」之後,現在位於「OneTwo」之後

我的問題是: 空字符串是否被字符串「Two」覆蓋,然後在末尾添加它自己的空字符。

或者是在開始時已經存在的空移回到最後?

(這個問題似乎不有所作爲,但我想知道的一切我學習)

謝謝

+4

如果您使用C++,則不需要'strcat'。使用'std :: string'和'+ ='。 – Drise 2012-08-06 19:40:20

回答

12

第一個\0被覆蓋,並且在連接字符串的末尾添加新的\0。這裏沒有「移動」任何東西的餘地。這些是值被分配到的位置。

2

是的,第一個參數strcat\0被覆蓋,並且變得連接字符串的最後一個字符。

它不移動正因爲如此,該功能只是追加\0作爲串聯字符串的最後一個字符。

2

唯一可以肯定的方法是查看您的特定版本strcat的來源。典型的實現將覆蓋第一個null並將第二個字符串中的null複製到最後一個位置。

雖然這確實是挑剔的,但無論使用哪種方法,您都無法檢測輸出的差異。

4

雖然問題已被正確和反覆回答,但從源代碼獲得最正常的答案可能會很好。或者至少從我可以在谷歌找到的消息來源。

This document,其聲稱是C++標準(或工作草案物)表示:

C++標準庫提供從C 庫[包括的strcat] 209種的標準功能。 - 「標準C庫」,C.2。7,第811

跳轉到this document自稱是中國際標準,我們可以看到:

strcat功能附加字符串的副本通過s2 指出(其中包括終止空字符)到由s1指向的字符串 的末尾。 s2的首字符將覆蓋s1末尾的空字符 。如果複製發生在重疊的對象 之間,則行爲是不確定的。

- 「大strcat功能」,7.21.3.1,第327

strcat的確實覆蓋空字符。