不是家庭作业问题。 我正在自学。 我必须通过递归删除字符串中的连续字符。然而,我制作的程序不适用于包含重复项的输入。它正在进行无限递归,因此会出现段错误。然而,它适用于其中没有连续重复项的输入。我尝试过在 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/