2017-03-03 18 views
0

txtファイルから読み取った大きな配列から空白を削除しようとしています。 私が扱う配列のstrlen()は約15,000〜22,500です。ここでC - 空白の削除

は私のコードです:

#include <stdio.h> 
#include <ctype.h> 

void whiteSpace(char str[]){ 
    int i, j; 
    for (i = 0; str[i] != 0; i ++){ 
     if (isspace(str[i])){ 
      for(j = i; str[j] != 0; j ++){ 
       str[j] = str[j + 1]; 
      } 
     } 
    } 
} 

これは、短い配列のために動作しますが、より大きなアレイのために、私は二回、すべての空白を取り除くためにのように空白を()を使用する必要がありますか?

私は関数が2〜3回呼び出されない限り、短い配列と大きな配列(15,000〜22,500)の配列に対してはなぜ機能するのか分かりません。

ありがとうございました。

+0

このような大きな記憶域のために動的メモリ割り当て.mallocを考える – minigeek

+1

[Cの文字列から空白を削除する](http://stackoverflow.com/questions/1726302/removing-spaces-from-a-string-in- c) – BLUEPIXY

答えて

2

小さな配列ではうまく機能しません。行内に2つの空白があると、エラーになります。

問題は、1つの空白をスキップすると、シフトされた文字も空白であるかどうかを確認することがないことです。

修正する方法はいくつかあります。最も簡単な方法は、ifwhileに変更することです。

+1

ありがとう、あなたは正しいです... – Paul

1

これはあなたのタスクを達成する最も効率的な方法ではありますが、表示されている特定の問題は複数のスペースが連続して発生しているためです。あなたがiループでスキャンしているとしたら、最初の2つのスペースが表示されているとします。だから、jループを開始し、配列内のすべてのものを先頭に1文字近づけて移動させます。移動する最初の文字は2番目のスペースで、最初のスペースがある場所に置きます。最終的に移動を終了し、iは次の文字に進みます。これは、最初のスペースがどこに移動したかを示す2番目のスペースを超えています。バッファにはスペースが残っていますが、iはそれを過ぎているので、後ろに残されます。

+0

配列内のすべての空白を取り除く最も効率的な方法は何ですか? – Paul

+2

1つの方法は、2つのインデックス( 'get'と' put')を配列の前方に移動させることです。それらが等しくなければ、 'str [get]'を 'str [put]'にコピーします。 'str [get]'が空白の場合、 'get'をインクリメントします(ただし、コピーはしません)。そうすれば、スペースではないものはアレイの前面に向かって押しつぶされます。 –

+0

ありがとうございました! – Paul