2010-10-14 84 views
1

我正在寫一個C程序,它需要使用n字符串並使用strcat連接它們。 首先我分配了目標字符串sizeof(char)*每個字符串+ 1(對於空字符)的strlen。然後用一個for我使用strncat來創建最終的字符串。 在和,我正在追加空字符。C字符串連接 - 奇怪的字符

一切都很好,但有時候,在目標字符串的開頭,有一些奇怪的字符(例如'?')。發生這種情況時,在程序執行期間,最後的字符串比以前更短(在同一執行期間)。

有什麼我失蹤?

這是代碼:

size = 0; 
for(i = 0; i < n; i++) { 
    size += sizeof(char)*(strlen(strings[i])); 
} 

size++; 

target = malloc(size); 

if(!target) { /** Error handling... */ } 

for(i = 0; i < n; i++) { 
    target = strncat(target, strings[i], strlen(strings[i])); 
} 

target[size] = '\0'; 

感謝,

-Donovan

+4

發佈實際的代碼。 – 2010-10-14 08:45:25

+0

你怎麼真的把第一個字符串放在目標字符串中? – SirDarius 2010-10-14 08:47:41

+0

對不起。現在還有代碼。 – Donovan 2010-10-14 08:51:26

回答

6

你應該分配後立即先初始化目標字符串爲空字符串。

target[0] = '\0'; 

第一次調用strncat時,第一個字符串將被追加到目標。如果你的目標沒有被初始化,它可能不是空的,這會導致你看到的垃圾字符。

(另一種解決方案是將第一你的字符串與strncpy複製到目標,然後將下面的字符串附加到它。)

+0

+1,我看着數組的錯誤末尾。 – schot 2010-10-14 08:59:10

2
target[size] = '\0'; 

大小n的陣列具有有效索引0n - 1。你可能想改變這種狀況到:(。雖然這不會導致你開始垃圾字符對於這一點,看到Didier Trosset's answer

target[size-1] = '\0'; 

爲您的代碼一些更多的提示:

  • sizeof (char) == 1的定義中,所以省略了省略。
  • 既然你知道字符串是否合適,你可以在這裏使用普通的strcat。這將爲您節省n致電strlen
  • 最後的target[size-1] = '\0'實際上是不需要的,因爲str(n)cat總是空終止其目標。
+0

我選擇了迪迪埃答案,但感謝您的提示(+1)! – Donovan 2010-10-14 09:02:23

1

順便說一下,每次撥打strncat()都必須遍歷字符串,才能找到插入的位置。這使您的功能O(n )。這是相當簡單的做的更好比(修改代碼以粗體是):

 
size = 0; 
for(i = 0; i < n; i++) { 
    size += strlen(strings[i]); 
} 

size++; 

target = malloc(size); 

if(!target) { /** Error handling... */ } 

char *current_ptr = target; 

for(i = 0; i < n; i++) { 
size_t len = strlen(strings[i]); 
    memcpy(current_ptr, strings[i], len); 
    current_ptr += len; 
} 

*current_ptr = 0; 
0

而且你不需要收集strncat函數的返回值回目標。