c++ - 递归地删除连续的重复项,给出无限递归

标签 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。运行时不会发生这种情况。我在这里缺少什么?

最佳答案

这一行:

input[i] = '\0';

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

相反,您需要减小字符串长度:

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

避免这种无限递归。

关于c++ - 递归地删除连续的重复项,给出无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51133338/

相关文章:

java - 读取文件并将数据插入到String[]中

无法使用 C 中的 getchar() 和指针表示法获取用户输入

c++ - 从读取之前关闭的文件中读取

c++ - 启用 -std=c++0x 时自定义分配器的编译问题

c++ - 使用 Windows USB 虚拟 Com 端口识别断开连接事件

javascript - 如何使用循环索引保存/清除 setTimeout 数组?

c++ - OpenCV/C++ 中的优化帮助

java将字符串存储在char数组中

c++ - 为什么我没有收到字节数组中的数据?

c++ - 如何从静态成员函数调用指向成员函数的指针?