从字符串中删除多余空格的程序

时间:2013-03-15 05:16:10

标签: c++ algorithm

我写了一个程序,它应该从字符串中删除多余的空格。但它只显示空格前的字符。它找到一个空格并在之后检查字符是否是空格。根据多余的空间,它会将其他角色转移到多余的空间。但输出非常混乱。

输入:“qwe(2个空格)rt(一个空格)y”

输出:“qwe(一个空格)rt(一个空格)y”

#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main(){
    string a;
    cin >> a;
    int len = a.length();
    int new_len=len;
    int z,s=0;
    for(int i=0; i<new_len; i++){
        if(a[i]==' '){
            z=i+1;
            s=0;
            //Assigning the number of excess spaces to s.
            while(a[z]==' '){
                s++;
                z++;
            }
            //doing the shifting here.
            if(s>0){
                for(int l=i+1; l<new_len-s; l++){
                    a[l]=a[s+l];
                }
            }
            new_len-=s;
        }

    }
    cout << a << endl;
    cout << a.length();
    system("pause");
    return 0;
}

3 个答案:

答案 0 :(得分:1)

您的代码非常无效。想象一下包含1,000,000个字符的以下字符串:

a  a  a  a  a  a  a...

每当你的算法遇到第二个空格时,它会遍历整个字符串,将其向左移动一个字符。我会尝试另一种方法:

  • 创建两个迭代器,如realPos和charPos。在开头将它们设置为0.
  • 创建一个变量,它存储到目前为止遇到的许多空格,如spacesSeen。将其设置为0。
  • 现在,虽然realPos低于整个字符串的长度:
    • 如果string[realPos] != ' 'charPos != realPos,请进行分配:string[charPos] = string[realPos]。然后将realPoscharPos加1。将spacesSeen设置为0。
    • 如果string[realPos] == ' 'spacesSeen == 0,请将spacesSeen加1,复制字符并推进两个迭代器。
    • 如果string[realPos] == ' 'spacesSeen > 0,则增加spacesSeen,然后仅增加realPos
  • 现在charPos标记了最终字符串结束的位置,调整字符串大小,使其结束。

简单来说:逐个复制字符并在途中跳过多个空格。

答案 1 :(得分:1)

您的大多数代码都是无意义的 - 当您使用普通字符串提取器(stream >> string)时,它会自动跳过所有连续的前导空格,并停止在第一个空白字符处读取。因此,它几乎已经完成了其余代码要完成的所有事情。这留下了一种更简单的方法来完成相同的任务:

std::copy(std::istream_iterator<std::string>(std::cin),
          std::istream_iterator<std::string>(),
          std::ostream_iterator<std::string>(std::cout, " "));

这确实有一个问题:它会在输出的 end 处留下一个额外的空间。如果您不想这样,可以使用我之前发布的infix_ostream_iterator。有了这个,你就可以将上面改为:

std::copy(std::istream_iterator<std::string>(std::cin),
          std::istream_iterator<std::string>(),
          infix_ostream_iterator<std::string>(std::cout, " "));

答案 2 :(得分:1)

如果你正在使用C ++ 11这样做你的方式是矫枉过正 - 你可以使用正则表达式。像下面这样的东西应该这样做(未经测试):

#include <regex>
#include <iostream>
#include <string>
using namespace::std;

int main(){
  string a;
  cin >> a;
  regex r(" +");
  a = regex_replace(a,r," ");
  cout << a << endl;
  cout << a.length();
  system("pause");
  return 0;
}