2011-12-17 163 views
-2
void empty_spaces(char array[]){ 
int j=0,i=0,n=0; 
n=strlen(array); 
while(i<n){ 
    if(array[i]==' '){ 
     j=i; 
     while(j<n){ 
      array[j]=array[j+1]; 
      ++j; 
     } 
     --n; 
    }else 
     ++i; 
} 
if(n>15) 
     n=15; 
array[n]='\0'; 
} 

有人可以解釋我,這段代碼嗎?這個函數清理數組中的空白空間,但是有人能夠解釋它到底是什麼工作嗎?C中的空白空間

+3

好吧,你總是可以在調試器中運行它,並逐步瞭解它的含義。之後,您可以回到這裏,回答一個具體的問題...... – 2011-12-17 22:38:36

+1

這段代碼中您的混淆源究竟是什麼? – Lion 2011-12-17 22:39:05

+0

它似乎壓縮所有的空白。然後截斷數組的長度爲15. – 2011-12-17 22:39:48

回答

0

它遍歷數組中的每個字符,刪除所有''(空格)字符。內循環是什麼擦除。當外部循環找到一個空格字符時,內部循環將數組的其餘部分「移動」到左邊的一個索引處,覆蓋空間。

-1

基本上,一旦循環遇到' '字符(空格),它將數組中的所有元素都移動到「左」位置,因此用下列字符替換空格。

+0

請在你的回答中更具描述性。並且通常提供示例代碼。 – 2018-01-27 08:07:09

5

這是一個相當鬆弛的嘗試,在一個函數中刪除字符串中的空格。代碼的問題是它有無償迭代,它將O(n)算法變成O(n^2)算法。

與其試圖理解你所擁有的代碼,我覺得最好是以高效和簡單的方式來完成它。喜歡這個。

void empty_spaces(char str[]) 
{ 
    char *src = str; 
    char *dst = str; 

    while (*src) 
    { 
     if (*src != ' ') 
     { 
      *dst = *src; 
      dst++; 
     } 
     src++; 
    } 
    *dst = '\0'; 
} 

我們進行整個字符串中的一個通帶兩個指針,srcdst。遇到非空格字符時,它將從源複製到目標。在數組中維護兩個單獨的指針避免了代碼中的虛假迭代。

我忽略了n>15部分代碼。這樣做的效果是字符串總是被截斷爲長度不超過15個字符,但是爲什麼這樣做對我來說是神祕的。這個功能當然不應該混淆在一起。

由於我沒有真正回答這個問題,但因爲我希望這對你有用,所以我做了答案社區wiki。

+0

'while(src)',你確定嗎? :p – fge 2011-12-17 22:43:27

+0

不回答問題,但「*此答案很有用*」:-) – cnicutar 2011-12-17 22:43:41

+0

@fge非常感謝。我頭腦中的編譯和測試失敗了! – 2011-12-17 22:45:43

1

重寫和上述的註釋版本:

//.... 
n = strlen(array); // n is the number of characters in the array up to the final 0 
while (i < n) { 
    if (array[i] != ' ') { // not a space 
     i++;    // next char, 
     continue;   // continue 
    } 

    j = i; // j is the current array index 

    while (j < n) {  // while there are chars left... 
     array[j] = array[j+1]; // copy the next character into the current index 
     j++; 
    } 
    n--;     // and remove one from the string len since a space is removed 
} 

返回之前限制所述字符串長度15後的代碼。

因此,此代碼刪除空格可能會截斷字符串爲15個字符只。