不是作业问题。 我正在自我学习。 我必须通过递归删除字符串中的连续字符。但是,我制作的程序不适用于包含重复项的输入。它正在无限递归中,因此产生了分割错误。但是,它适用于其中没有连续重复项的输入。我曾尝试在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。在运行时不会发生这种情况。我在这里想念什么?
答案 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 ++。