2012-11-18 35 views
2

我使用下面的代碼來創建的「關鍵」可以用來測試哈希表(特別是我測試刪除項目所需的時間)不同在我標註評論的行中,有一種奇怪的行爲。我正在使用sprintf將「temp_key」的內容複製到「key」。在此之前,我用strncpy()函數來「temp_key」到「關鍵」,但我從這個操作得到的結果是這樣的(從Xcode的調試印刷)的內容複製:strncpy()函數行爲與sprintf的的

Printing description of key: 
(char *) key = 0x0000000100103ed0 "Key: 10\xb0\xe7\x03\x01\x10" 

而「temp_key」產生下面的輸出:

Printing description of temp_key: 
(char [20]) temp_key = "Key: 10" { 
    [0] = 'K' 
    [1] = 'e' 
    [2] = 'y' 
    [3] = ':' 
    [4] = ' ' 
    [5] = '1' 
    [6] = '0' 
    [7] = '\0' 
    [8] = '\0' 
    [9] = '\0' 
    [10] = '\0' 
    [11] = '\0' 
    [12] = '\0' 
    [13] = '\0' 
    [14] = '\0' 
    [15] = '\0' 
    [16] = '\0' 
    [17] = '\0' 
    [18] = '\0' 
    [19] = '\0' 
} 

散列表使用memcmp比較htable_item_search函數中的鍵。但使用strncpy有一些項目(如「Key:10」),這些項目在使用sprintf時沒有找到,所以它可以很好地工作。那麼爲什麼這種差異?

+0

爲什麼不使用'strdup'。它完全符合你的'strlen + malloc + strcpy',只是在一個簡單的調用中。它在任何情況下都可以廣泛使用。 –

+0

而你'sprintf'爲false:它應該讀'sprintf(temp_key,「Key:%d」,i);'。因爲使用了數組的&,所以你必須強制禁止警告。 –

+0

而在C中,你的函數簽名應該是'void remove_keys(void)'。 '()'意味着C中完全不同的東西。在C++中它可以,但不在C中。 –

回答

3

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

沒有空字符在目的端被隱含所附如果源小於NUM長(因此,在這種情況下,目的地可以不是空結尾的C字符串)。

strncpy不會爲您的字符串添加一個空終止符,因此您在使用此函數時會在字符串末尾出現垃圾。

+0

謝謝,我通過使用strncpy解決了問題,並最終手動添加了一個空終止符。 –

+1

不客氣!總是檢查c引用,同時從lib方法中發現任何令人不安的行爲:在函數後面存在一個完整的基本世界^^ – Rubens