通过使用带有指针参数的函数从char数组中删除空格

时间:2014-12-30 17:50:09

标签: c++ arrays char spaces

所以我正在研究这本书,并且我遇到了一个练习(简要地)要求我使用函数删除char数组的所有空格:void removeSpaces(char * s)

[iostream,包含cstring且定义了SIZE]

这是main():

int main() {
  char a[SIZE] = "a bb ccc d";
  cout << a << endl; // a bb ccc d
  removeSpaces(a);
  cout << a << endl; // a bb ccc d instead of abbcccd
}

这是removeSpaces():

void removeSpace(char* s) {
  int size = strlen(s);

  char* cpy = s;  // an alias to iterate through s without moving s
  char* temp = new char[size]; // this one produces the desired string
  s = temp; // s points to the beginning of the desired string

  while(*cpy) {
      if(*cpy == ' ')
          cpy++;
      else
          *temp++ = *cpy++;
  }

  cout << s << endl; // This prints out the desired result: abbcccd
}

(我选择的名字并不理想,但现在没关系。)所以我的函数基本上做了我想做的事情,除了结果在函数范围之外没有影响。我怎么能做到这一点?我错过了什么,我做错了什么?

6 个答案:

答案 0 :(得分:1)

您的功能甚至不应该进行任何字符串复制。它应该只是进行就地替换:

void removeSpace(char* s)
{
    for (char* s2 = s; *s2; ++s2) {
        if (*s2 != ' ')
            *s++ = *s2;
    }
    *s = 0;
}

甚至更为严厉:

void removeSpace(char* s)
{
    char* s2 = s;
    do {
        if (*s2 != ' ')
            *s++ = *s2;
    } while (*s2++);
}

答案 1 :(得分:1)

由于您按值传递指针,因此您肯定会更改数组。显然,你要删除这样的空格:

void removeSpaces(char* s) {
    *std::remove(s, s + strlen(s), ' ') = 0;
}

答案 2 :(得分:1)

您更改了s的值,但这是一个局部变量,因此在函数外没有任何影响:

void removeSpace(char* s)

您可以将其更改为:

void removeSpace(char*& s)

这引用了传递的值。因此,更改s将改变原始版本。不幸的是,由于您调用removeSpace()的方式(当您传递数组时),这对您不起作用。

char a[SIZE] = "a bb ccc d";
removeSpaces(a);

您也可以更改代码:

char buffer[SIZE] = "a bb ccc d";
char* a = buffer;
removeSpaces(a);

现在上面提到的修改可以正常工作。但是你正在泄漏内存(你在removeSpace()中动态分配永不释放的内存。解决这个问题的最好方法是使用现代C ++技术而不是编写C并用C ++编译器编译它。

一些解决方案:

  1. 修改数组(无动态分配)
  2. 使用适当的容器(std :: string或std :: vector)
  3. 使用标准算法。

答案 3 :(得分:0)

只需在函数中添加最后一行: -

strcpy(s, temp);

删除不必要的: -

s = temp;

答案 4 :(得分:0)

removeSpaces的调用没有任何影响,因为您正在函数中创建临时缓冲区,并在应用转换时将字符串复制到该缓冲区中。您可以通过删除临时缓冲区并仅修改字符串来解决此问题。

void removeSpaces(char* s)
{
    char* cpy = s;  // an alias to iterate through s without moving s
    char* temp = s;

    while (*cpy)
    {
        if (*cpy != ' ')
            *temp++ = *cpy;
        cpy++;
    }
    *temp = 0;

    cout << s << endl; // This prints out the desired result: abbcccd
}

答案 5 :(得分:0)

您的函数会收到指针a的副本。更改函数中的副本不会更改调用者的原始指针。