我想删除重复的相邻字符,如下所示:
输入:goooggllee
输出:gogle
VC6.0给出了我想要的结果:gogle。
虽然code :: blocks后面跟着一些奇怪的字符,
例如:gogle' $♦。
只是奇怪的痕迹。
以下是程序。
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
void deleteRepeatChar(char *instr,char *outstr)
{
char *p=instr;
*outstr=*p;
++outstr;
while(*p){
char *q=p;
while(*(q+1)==*(outstr-1)) // compare with the former char
++q;
if(q>p){
*outstr=*(q+1);
++outstr;
p=q+1;
}
else{
++p;
*outstr=*p;
++outstr;
}
}
*outstr='\0';
}
int main()
{
const int sz=100;
char str[]="gooooggllle";
char out[sz];
deleteRepeatChar(str,out);
for(auto &c:out)
cout<<c;
cout<<endl;
return 0;
}
答案 0 :(得分:0)
正如Jerry Coffin所说,使用std :: unique是可行的方法。从概念上讲,它遍历字符串,每次找到连续字符时,它都会将字符串的其余部分移向开头。因为std :: unique没有删除空终止,所以不必担心它。
#include <iostream>
#include <algorithm>
int main() {
char str[]="gooooggllle";
std::unique(std::begin(str),std::end(str));
std::cout << str;
return 0;
}
或住在:http://ideone.com/WEZ0Zk是如何使用它的示例。
更改字符串的速度可能比使用更改的字符串制作副本要快得多,但是如果您确实希望将修改后的字符串复制到新字符串中,则可以使用std :: unique_copy
#include <iostream>
#include <algorithm>
int main() {
char str[]="gooooggllle";
char out[sizeof(str)];
std::unique_copy(std::begin(str),std::end(str),std::begin(out));
std::cout << out;
return 0;
}
有关std :: unique的更多信息,请参阅http://en.cppreference.com/w/cpp/algorithm/unique
在我看来,在代码中尽可能经常使用标准算法是一种很好的做法,因为它不仅可以节省您的时间和运行速度,还可以为您节省无数错误,但最重要的是 - 它可以让其他人了解您的快速编码。有一些知名人士,例如来自Adobe的Sean Parent,他们说,无论何时你写一个for循环,你做错了什么,总会有一个算法可以做你想要的。