【发布时间】:2018-12-10 12:20:32
【问题描述】:
不是作业问题。 我是自学的。 我必须通过递归删除字符串中的连续字符。但是,我制作的程序不适用于包含重复项的输入。它正在进行无限递归,因此会产生分段错误。但是,它适用于其中没有连续重复的输入。我曾尝试在 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。这在运行时不会发生。我在这里缺少什么?
【问题讨论】:
-
你的代码的输入是什么?你真的应该在 C++ 中使用
std::string而不是char ch[1000]。 -
输入:abc O/p:abc 输入:aabccde O/P:abcde
-
递归调用在这里并没有真正帮助您的代码。你可以环顾四周。应该避免递归是可能的。如果您将其作为练习,那么我将用 memmove 替换 for 循环。循环看起来有点奇怪。通常 i 的初始化在 for 之后。我希望在这里待一段时间。可能会做一段时间。是否需要写入空字符,因为无论如何它都是退出循环的条件。尝试添加 if(input[i] != '\0'),我怀疑它永远不会触发并且可以删除。
-
c++:
string text; cin >> text; cout << "Before : " << text << "\n"; text.erase(std::unique(text.begin(), text.end()), text.end()); cout << "After : " << text << "\n"; -
在 C++ 中,你可以使用
*std::unique(input, input + strlen(input)) = '\0';。
标签: c++ arrays pointers recursion char