2011-04-22 109 views
2

我在C中有一個函數,我試圖從兩個不同的位置(未知大小,可能會安靜很大)獲取字符串,並將它們合併爲一個字符串並返回它們。如果我只是打印兩個字符串,然後我得到正確的結果,但是當我嘗試使用strcat結合字符串時,我最終得到了5個垃圾字符,然後是組合字符串的結果。C strcat垃圾字符

任何人都有一些建議,我做錯了什麼?下面是一些示例代碼來演示我在做什麼:

static int get_information(char** results) 
{ 
    size_t s1_length; 
    size_t s2_length; 

    /* DEBUGGING - Prints the correct string */ 
    printf(get_string_1()); 
    printf(get_string_2()); 
    printf("\n"); 

    /* Allocate memory for new string */ 
    s1_length = strlen(get_string_1()); 
    s2_length = strlen(get_string_2()); 
    *results = malloc(sizeof(char) * (dir_length + file_length)); 

    if(results == NULL) 
     return -1; 

    /* Combine the strings */ 
    strcat(*results, get_string_1()); 
    strcat(*results, get_string_2()); 

    /* DEBUGGING - prints 5 garbage characters then the correct string */ 
    printf(*results); 
    printf("\n"); 

    return 0; 
} 
+0

什麼是dir_length和file_length? – taskinoor 2011-04-22 04:47:20

+0

'printf(get_string_1());'最好是'printf(「%s」,get_string_1());'如果字符串中包含百分比字符。 – 2011-04-22 04:48:51

+0

Btw:'sizeof(char)'被C標準定義爲1,所以你可以跳過這個。 – ChrisWue 2011-04-22 04:54:45

回答

7

strcat需要找到目的地的空終止符。您的*result指向未初始化的內存,恰好有5個字符的空終止符。

在組合字符串之前添加*result[0]='\0';應該修復它。

此外,您沒有在*result中爲空終止符分配足夠的空間。

+0

拯救生命!謝謝 :) – IcyBlueRose 2013-08-22 04:04:15

4

爲什麼你strcat的第一個字符串?只需複製它。否則將追加到任何垃圾是在未初始化的內存...

/* Combine the strings */ 
strcpy(*results, get_string_1()); 
strcat(*results, get_string_2()); 
2

的strcat()假定目標是一個有效的字符串,因此通過增加

*results[0] = '\0'; 

使它所以你做的strcat()之前

或者嘗試做這些:

strcpy(*results, get_string_1()); 
strcat(*results, get_string_2()); 

最後,這一行究竟發生了什麼:

*results = malloc(sizeof(char) * (dir_length + file_length)); 

確保爲結果分配了足夠的空間。理想情況下它應該是:

*results = malloc(sizeof(char) * (s1_length+s2_length+1)); 

用於分配足夠的空間作爲S1,S2以及隨後終止「\ 0」字符。