0

文字列から余分なスペースを削除するプログラムを作成しました。ただし、スペースの前の文字のみが表示されます。スペースを見つけて、その後、スペースかどうかをチェックします。余分なスペースに応じて、他の文字を余分なスペースに移動します。しかし、出力は非常に混乱します。

入力: "qwe(2スペース)rt(1スペース)y"

出力: "qwe(one space)rt(one space)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

これを行う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 に答える
1

ほとんどのコードは無意味です。通常の文字列エクストラクタ ( stream >> string) を使用すると、連続するすべての先頭の空白が自動的にスキップされ、最初の空白文字で読み取りが停止します。そのため、コードの残りの部分が達成しようとしているほとんどすべてのことを既に実行しています。これにより、同じタスクを達成するためのはるかに簡単なアプローチが残ります。

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

これには 1 つの問題があります。出力の最後に余分なスペースが 1 つ残ります。それを望まない場合は、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

あなたのコードは非常に効果的ではありません。1,000,000 文字の次の文字列を想像してください。

a  a  a  a  a  a  a...

アルゴリズムが 2 番目のスペースに遭遇するたびに、文字列全体を調べて 1 文字左にシフトします。私は別のアプローチを試みます:

  • realPos と charPos のような 2 つの反復子を作成します。最初は 0 に設定してください。
  • spaceSeen のように、これまでに検出されたスペースの数を格納する変数を作成します。0 に設定します。
  • さて、 realPos は文字列全体の長さよりも小さいですが:
    • string[realPos] != ' 'との場合、次charPos != realPosの割り当てを行いますstring[charPos] = string[realPos]realPos次に、両方と1 を増やしcharPosます。spaceSeen を 0 に設定します。
    • と の場合string[realPos] == ' '、1 ずつspacesSeen == 0増やして、文字をコピーし、両方の反復子を進めます。spacesSeen
    • string[realPos] == ' 'との場合spacesSeen > 0は、 を増やしspacesSeenてから、 だけを増やしrealPosます。
  • charPos は、最終的な文字列が終了する場所をマークし、そこで終了するように文字列のサイズを調整します。

簡単に言えば、文字を 1 つずつコピーし、途中で複数のスペースをスキップします。

于 2013-03-15T05:38:08.557 に答える