为什么代码来自VC6.0和Code :: Blocks?

时间:2014-07-24 16:30:32

标签: c++ visual-c++ codeblocks

我想删除重复的相邻字符,如下所示:
输入: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;
}

1 个答案:

答案 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循环,你做错了什么,总会有一个算法可以做你想要的。