2011-11-21 96 views
1

我遇到strncpy()問題,需要按照我需要的長度複製一個額外的字符。我需要將10個最高有效位從一個字符串複製到另一個(均爲char*格式)。strncpy()字符串長度輸出錯誤

較大的變量的大小並不直觀,而較小的隻影響輸出,當它顯着小於我需要的值(我不知道這是爲什麼)。

我的strncpy()中的n值可能是導致問題的原因,但我不知道爲什麼它按照原樣行事。如果我沒有弄錯,n,即目標字符串的長度,應該比數據長1,以便在最後說明空字符。

我的字符串沒有這樣的行爲。設置n11,我收到以下輸出:

00000111101100100100001110100000 

00000111101 

我會想象它只會複製10個字符,最後一個爲空。增加n產生相同的結果。

增大或減小n至10揭示了問題的心臟:

00000111101100100100001110100000 

[email protected] 

我不知道爲什麼它會做到這一點,但它仍然要做到這一點正下降,直到n小得多(約8)。

這些是我的代碼的相關線路:

char line[11], hexAddr[8], binAddr[33], lv1Index[11]; 
    ... 
strncpy(lv1Index, binAddr, 10); 

其中lv1Index是在此之前不動,並顯示binAddr(在給定的輸出)直接預先。

添加的字符總是@,所以我不相信這是從lv1Index預初始化的垃圾。

回答

3

one C++ reference

如果找到該源C字符串(這是由一個空字符信號發送)​​的端部num個字符已被複制之前,目的地被用零填充,直到總共NUM的字符已被寫入。

沒有空字符被隱式地附加到目的地的末尾,所以如果源中的C字符串的長度小於num,則目的地將僅以空終止。

其他文檔(MSDNman page)也有類似的信息。

這意味着你應該把空終止你自己:

lv1Index[10] = '\0'; 
+0

+1,而且,如果他知道原始字符串的長度超過10個字符,他應該使用'memcpy',而不是'strncpy' – Paulpro

+0

啊,好吧,我仍然不完全明白爲什麼一切都是這樣發生的(爲什麼不同的n值改變了輸出,看起來與目的地的大小無關),但是這解決了我的問題。謝謝! –