从字符串中删除字符

时间:2010-10-31 04:40:11

标签: c++ pointers

我想编写一个代码,用于删除字符串中的给定字符。我想出了以下代码片段。

现在,虽然这是我的工作,它给我一个O(n ^ 2)的最坏情况复杂性。任何人都可以帮助我改进这一点。

#include<iostream.h>
#include<conio.h>
#include<stdio.h>

void Push(char *, int i);

int n=6;

int main()
{
 clrscr();
 char *p = "helelo";
 char delChar = 'e';

 for(int i=0;i<5;i++)
 {
  if(*(p + i) == delChar)
  {
   Push(p, i);
  }
 }
 cout<<p<<endl;
 getch();
 return 1;
}

void Push(char *p, int i)
{
 for(int k=i;k<n;k++)
 {
  *(p + k) = *(p+k+1);
 }
}

由于

4 个答案:

答案 0 :(得分:4)

#include <cstring>
#include <algorithm>
#include <iostream>

int main() {
  using namespace std;

  char s[] = "helelo";
  cout << s << '\n';

  char *end = s + strlen(s);
  end = remove(s, end, 'e');
  *end = '\0';
  cout << s << '\n';  // hllo

  return 0;
}

请注意,您无法修改字符串文字,因此我使用了char数组。 std :: string会更容易。

如果你想了解std :: remove是如何工作的,那么char * instantiation(因为它是一个模板)会保持简单,如下所示:

char* remove(char *begin, char *end, char value) {
  char *next = begin;
  for (; begin != end; ++begin) {
    if (*begin != value) {
      *next++ = *begin;
    }
  }
  return next;
}

答案 1 :(得分:0)

一个想法是使用有效字符(不同于不需要的字符)从第一个字符串构造一个新字符串,然后用构造的字符串初始化第一个字符串。

答案 2 :(得分:0)

这样的事情应该这样做:

char *p = "helelo";
char delChar = 'e';
int len = strlen(p);

for(int j=0, int i=0;i<len;i++)
{
  if(*(p + i) != delChar)
  {
    *(p+j)=*(p+i);
    ++j;
  }
}
 *(p+j)='\0';

 cout<<p<<endl;
 getch();
 return 1;

答案 3 :(得分:0)

怎么样:

int main() {
  clrscr();
  char *p = "helelo";
  char delChar = 'e';

  int k=0;
  for( int i=0; *(p+i); i++ ) {
    if(*(p + i) != delChar) {
      *(p + k++) = *(p + i);
    }
  }
  *(p + k) = '\0';
  cout<<p<<endl;
  getch();
  return 1;
}