2013-03-12 50 views
-2

我一直在尋找這個問題的答案一段時間,我似乎無法找到解決方案。當參數長度不同時,沒有錯誤。當它們長度相同時,會發生段錯誤。該函數用於比較兩個字符串並返回一個新字符串,其中包含每個第i個字符中最大的字符串。我的功能如下:C99分割溢出strlen,不一致

char* charMax(char* string1, char* string2) 
    { 
     int length1 = strlen(string1); 
     printf("%d", length1); 
     int length2 = strlen(string2); 

     int lengthLarge = length1 >= length2 ? length1 : length2; 
     int lengthSmall = length1 <= length2 ? length1 : length2; 

     char* largerString = length1 >= length2 ? string1 : string2; 
     char* result = malloc(lengthLarge + 1); 


     for (int i = 0; i < lengthSmall; i++) 
      result[i] = string1[i] > string2[i] ? string1[i] : string2[i]; 

     if (length1 != length2) 
     { 
      for (int i = lengthSmall; i < lengthLarge; i++) 
       result[i] = largerString[i]; 

      result[lengthLarge + 1] = '\0'; 

      return result; 

      free(result); 
     } 
    } 

感謝您的幫助!

回答

3

好吧,它可能與兩個字符串具有完全相同的長度的事實有關,你的函數永遠不會返回任何東西,所以它的結果是垃圾。然後將其解釋爲指針。而......呃......你知道接下來會發生什麼,不是嗎?

讓我們正確縮進代碼並添加一些評論,我們?

char* charMax(char* string1, char* string2) { 
    int length1 = strlen(string1); 
    printf("%d", length1); 
    int length2 = strlen(string2); 
    int lengthLarge = length1 >= length2 ? length1 : length2; 
    int lengthSmall = length1 <= length2 ? length1 : length2; 

    char* largerString = length1 >= length2 ? string1 : string2; 
    char* result = malloc(lengthLarge + 1); 

    for (int i = 0; i < lengthSmall; i++) { 
     result[i] = string1[i] > string2[i] ? string1[i] : string2[i]; 
    } 
    if (length1 != length2) { 
     for (int i = lengthSmall; i < lengthLarge; i++) { 
      result[i] = largerString[i]; 
     } 

     result[lengthLarge + 1] = '\0'; 

     return result; 

     free(result); /* uhm, what? this will never execute */ 
    } 

    /* oops - what happens now? who knows? */ 
} 
+0

我把支架放錯了地方。多麼愚蠢的錯誤。謝謝。 – user2159044 2013-03-12 02:33:41

1

有幾個問題,Nik的答案指出了主要的問題。另外一個是在這裏:

result[lengthLarge + 1] = '\0'; // out of bounds! 
// this should be result[lengthLarge] = '\0' 

而且,這個簽名是你的目的更好:

char* charMax(const char *string1, const char *string2); 
+0

好抓!我*完全*錯過了! – 2013-03-12 01:43:30

+0

感謝您的幫助。我是C新手,char * string1和char * string1有什麼區別?我明白char string1 []之間的區別,但我沒有意識到還有另一種選擇。 – user2159044 2013-03-12 02:37:46

+0

@ user2159044,它們是完全相同的,但是指針定義通常寫在變量名稱的旁邊,而不是類型('int a,* b'定義了一個整數和指針)。我實際上建議使用'const'來傳遞字符串。 – perreal 2013-03-12 02:58:51