0

所以我正在编写一个字符串片段重组程序并且遇到以下问题。如果一个字符串包含在另一个字符串中,我需要将第一个字符串设置为两个字符串中的较大者(这是我将两个字符串合并在一起时的关键)。但是,由于某种原因,我的引用传递一直搞砸了,字符串永远不会重新分配,因此合并搞砸了。

这是通过引用传递:

int oneRound(char*frags[], int* numFrags) {
    int currMax = 0;
    int max = 0;
    int mergeOne = 0;
    int mergeTwo = 0;
    char *fragOne;
    char *fragTwo;
    for(int i = 0; i < *numFrags; i++) {
            for (int j = i+1; j < *numFrags; j++) {
                    fragOne = frags[i];
                    fragTwo = frags[j];
                    currMax = FindMaxOverlap(&fragOne, &fragTwo);
                    if (currMax >= max) {
                            max = currMax;
                            mergeOne = i;
                            mergeTwo = j;
                    }
            }
    }

这是它在下面调用的函数:

int FindMaxOverlap(char**firstString, char**secondString)
      if (strstr(*firstString, *secondString) != NULL || strstr(*secondString, *firstString) != NULL) {
            maxOverlap = length;
            if (strlen(*firstString) < strlen(*secondString)) {
                    char *temp = *firstString;
                    *firstString = *secondString;
                    *secondString = temp;
            }
    } 
4

2 回答 2

4

此代码正在更改(临时)变量fragOnefragTwo

fragOne = frags[i];
fragTwo = frags[j];
currMax = FindMaxOverlap(&fragOne, &fragTwo);

它没有修改数组的元素frags,我认为这是预期的行为。传递数组元素的地址来实现重新分配:

currMax = FindMaxOverlap(&frags[i], &frags[j]);

此外,正如Jite在评论中指出的那样,FindMaxOverlap()必须返回一个int否则行为未定义。

于 2013-04-15T13:23:56.847 回答
0

您是否尝试过使用gdb 单步执行您的代码?我不知道您使用的是什么编译器,但是使用 gcc,您可以使用带有 -g 开关的 gcc 编译代码:

$ gcc -g maxover.c -o max

然后您可以使用 gdb 逐步完成它:

 gdb max.out

爱你的调试器:)

于 2013-04-15T13:24:59.463 回答