【问题标题】:a programm which removes excess spaces from a string [duplicate]从字符串中删除多余空格的程序[重复]
【发布时间】:2013-03-15 15:12:12
【问题描述】:

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

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

【问题讨论】:

  • 你调试过你的代码吗?
  • 这是你想要做的吗? stackoverflow.com/questions/8362094/…
  • 我会咨询 std::string 并考虑使用 find_first_of()find_first_not_of() 及其类似物来提高效率。
  • std::string a; cin &gt;&gt; a; 跳过前导空格,仅将数据读入a,直到遇到更多空格(不会读入a)或文件结尾,所以你不能可能有任何空白要删除的输入。如果您将cout &lt;&lt; "a '" &lt;&lt; a &lt;&lt; "'\n"; 放入您的程序中,您会注意到:这样的“跟踪”输出对于编程来说是必不可少的诊断,并且可以让您观察您的程序工作......

标签: c++ algorithm


【解决方案1】:

您的大部分代码都是半无意义的——当您使用普通字符串提取器 (stream &gt;&gt; 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】:

如果您正在使用 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;
}

【讨论】:

    【解决方案3】:

    您的代码非常无效。想象一个包含 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 &gt; 0,则增加spacesSeen,然后仅增加realPos
    • 现在 charPos 标记您的最终字符串结束的位置,调整字符串大小,使其结束。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2013-06-03
      相关资源
      最近更新 更多