【问题标题】:Pass by reference with strings使用字符串通过引用传递
【发布时间】:2013-04-07 14:32:06
【问题描述】:

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

这里是引用传递:

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;
            }
    } 

【问题讨论】:

  • 如何声明fragOnefragTwo
  • 到目前为止,我在这里看不到问题。它必须在提供的代码之外。
  • 你能举一个失败的字符串对的例子吗?
  • 您可能希望使用一小部分您知道的输入来创建错误的结果,然后使用调试器逐行执行代码,以查看一切是否正确。
  • 我希望这不是你完整的 FindMaxOverlap 函数,因为你已经说过它将返回一个 int 而我看不到你处理代码中的那部分。

标签: c pointers memory pass-by-reference


【解决方案1】:

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

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

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

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

此外,正如 cmets 中的 Jite 所指出的,FindMaxOverlap() 必须返回 int,否则行为未定义。

【讨论】:

  • 不错的收获。这些错误很容易一目了然:)
【解决方案2】:

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

$ gcc -g maxover.c -o max

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

 gdb max.out

爱你的调试器:)

【讨论】:

    猜你喜欢
    • 2014-08-11
    • 2017-07-25
    • 2016-07-05
    • 2018-09-01
    • 1970-01-01
    • 2010-11-21
    • 2010-12-24
    • 2010-11-19
    • 2018-12-07
    相关资源
    最近更新 更多