递归删除连续重复项,以提供无限递归

时间:2018-07-02 09:49:09

标签: c++ arrays pointers recursion char

不是作业问题。 我正在自我学习。 我必须通过递归删除字符串中的连续字符。但是,我制作的程序不适用于包含重复项的输入。它正在无限递归中,因此产生了分割错误。但是,它适用于其中没有连续重复项的输入。我曾尝试在Eclipse Ide中调试,但是调试时事情变得很奇怪。 (我知道如何调试),但是我无法弄清调试和运行时的不同之处。我会在代码后给您示例。

#include <iostream>
#include <cstring>
using namespace std;

void removeConsecutiveDuplicates(char *input) {
    int l = strlen(input);
    if(l == 0) {
      return;
    }
    if(input[0] != input[1]) {
        removeConsecutiveDuplicates(input+1);
        return;
    }
    int i = 1;
    for(; input[i] != '\0'; ++i) {
      input[i-1] = input[i];
    }
    input[i] = '\0';
    removeConsecutiveDuplicates(input);
}
int main(void) {
    char ch[1000];
    cin >> ch;
    cout<<"The String Before Removing Duplicates : "<<ch<<endl;
    removeConsecutiveDuplicates(ch);
    cout<<"The String After Removing Duplicates : "<<ch<<endl;
    return 0;
}

当我调试此代码时,我看到变量l的值为16。在运行时不会发生这种情况。我在这里想念什么?

3 个答案:

答案 0 :(得分:2)

此行:

input[i] = '\0';

不执行任何操作(input[i]已经具有该值,因为那是循环的结束条件)。然后,您递归调用removeConsecutiveDuplicates函数,但是字符串的长度仍然相同,因此您将继续进行递归调用,直到发生堆栈溢出为止。

相反,您需要使字符串长度更短:

input[i - 1] = '\0';

以避免这种无限递归。

答案 1 :(得分:1)

要传递您自己分配的作业问题:),请解释为什么以下行在您的代码中永远无效:

input[i] = '\0';

答案 2 :(得分:1)

在您的函数中,更改以下内容:

input[i] = '\0';

对此:

input[i-1] = '\0';

由于您已切掉一个字符,因此应减小字符串的大小。

否则,您将不会减小大小,因此,如果不改变大小,一次又一次地循环相同的大小,将导致无限循环(因为大小不变)。


我建议您下次使用std::string,因为这是C ++。