2013-03-12 24 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