2017-03-03 142 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]; 
      } 
     } 
    } 
} 

這適用於短數組,但對於更大的陣列,我必須使用空格(),如兩次擺脫所有的白色空間?我認爲算法是正確的,我不知道爲什麼它適用於短陣列和大型(15,000〜22,500)陣列的毛刺,除非我調用函數兩次或三次。

謝謝。

+0

考慮動態內存allocation.malloc這樣更大的存儲的東西 – minigeek

+1

[刪除空間從C中的字符串?](http://stackoverflow.com/questions/1726302/removing-spaces-from-a-string-in- c) – BLUEPIXY

回答

2

對於小型陣列來說它不能正常工作。如果你連續有兩個空格,它將會出錯。

問題是,當它跳過一個空格時,它從不檢查轉移的字符是否也是空格。

有幾種方法可以解決它。最簡單但不是最好的方法是將if更改爲while

+1

謝謝,你是正確的... – Paul

1

這是關於可以完成您的任務的最低效方式,但您看到的特定問題是由連續多個空格造成的。想象一下,你在i循環中掃描,你會看到兩個空格中的第一個。因此,您啓動j循環,將數組中的所有內容都移動一個字符靠近開頭。你移動的第一個字符是第二個空格,並且你把它放在第一個空格的位置。最後,你完成移動,i前進到下一個角色 - 這是你移動到第一個空間的第二個空間。現在緩衝區中剩下一個空間,但i正在指向它,所以它會被留下。

+0

什麼是最有效的方式擺脫陣列中的所有空白? – Paul

+2

一種方法是讓兩個索引('get'和'put')在數組中向前移動。如果它們不相等,則將'str [get]'複製到'str [put]'中。如果'str [get]'是一個空格,那麼你增加'get'(但不要複製)。這樣,所有不是空間的東西都會擠到陣列的前面。 –

+0

非常感謝! – Paul