0

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

输入:“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;
}
4

3 回答 3

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一。将 spaceSeen 设置为 0。
    • 如果string[realPos] == ' 'spacesSeen == 0,加spacesSeen一,复制字符并推进两个迭代器。
    • 如果string[realPos] == ' 'spacesSeen > 0,则增加spacesSeen,然后只增加realPos
  • 现在 charPos 标记最终字符串结束的位置,调整字符串大小,使其结束。

用更简单的话来说:一个一个地复制字符并在途中跳过多个空格。

于 2013-03-15T05:38:08.557 回答
1

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

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

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

std::copy(std::istream_iterator<std::string>(std::cin),
          std::istream_iterator<std::string>(),
          infix_ostream_iterator<std::string>(std::cout, " "));
于 2013-03-15T05:47:59.993 回答
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;
}
于 2013-03-15T05:59:21.107 回答