2016-11-04 52 views
1

我一直在嘗試使用一些帶有字符和一些空字符的索引來獲取字符數組,並將其更改爲僅包含字符的數組 - 將索引移到需要時刪除空的空格處。C-Shift Array

這是我的做法至今:

char *args[256]; 
void removeNulls(){ 
    for(int i=0; i<=token; i++){ 
     if(args[i] == '\0'){ 
      shiftleft(i); 
     } 
     } 
} 

void shiftleft(int start){ 
    for(int i=start; i<token; i++){ 
      *(args+i) = *(args + i +1); 
       } 
} 

但是,我這樣做,並打印出結果時,我注意到,args數組, 即初始args數組中,它包括:空,null,1,2,3,4在刪除null之後,該數組變爲null,而不是所需的1,2,3,4。在我的循環條件中是否存在某些我未能解決的問題?

+1

您能否顯示您的完整程序?這不會編譯。 – Schwern

+0

順便說一下,'*(args + i)'有一個方便的簡寫:它可以(通常是)寫成'args [i]'。 –

回答

4

每當你點擊一個空時,就會跳過一個索引,因爲即使在跳過時你也總是增加i。你應該增加i只有當沒有跳過,比如像這樣:

for (int i=0; i<=token;) { 
    if (args[i] == '\0') { 
     shiftleft(i); 
    } else { 
     i++; 
    } 
} 

順便說一句,該算法不是最優的,當有多個空值,因爲對於每一個空,你卻將全部剩餘部分。通過跟蹤當前索引和下一個填充索引,可以一次過移動空值內容。對於每個空值,下一個填充索引將比當前索引落後一步。

for (int i=0, next = 0; i<=token; i++) { 
    if (args[i] != '\0') { 
     args[next++] = args[i]; 
    } 
} 

最後一件事情,多餘的元素呢?也就是說,對於輸入null,null,1,2,3令牌,結果內容將爲1,2,3,2,3令牌。那樣好嗎?我建議檢查你的要求,也許你有一些關於這些剩餘要素的任務。我爲你的鍛鍊留下了這一點。

0

在i = 0時,當shiftleft(0)被調用時,

無論值是在地址由(參數+ⅰ)指出 - >(參數+ 0) - > 「空」 被替換爲(參數+ I + 1) - >(參數+ 0 + 1) - > 「空」。

這就是爲什麼你的輸出打印出空,1,2,3,4。

將您的輸入更改爲空,1,2,3,4,您將看到不同。輸出將爲1,2,3,4