2012-09-21 96 views
-2

假設我有一個char* word = "abaradasaddragfavvdavgasbga00rarcrawabr0ac0ra0ra0vra0" ,我想從word刪除所有'0' chars,到位,而無需使用額外的內存或memmove。我怎麼能這樣做? 所以輸出爲:"abaradasaddragfavvdavgasbgararcrawabracraravra" **我曾嘗試**:去除串字符 - Visual C

void removeZeros(char* word) { 

    int size = strlen(word); 
    int i; 
    for(i = 0; i < size; i++){ 
     if(word[i] == '0'){ 
      word[ i ] = word[ i + 1 ]; 
      i++; 
     } 
    } 
} 

*規則**:

  • 應該要做到位
  • 不應調用任何內置功能如memmoveremove
  • 不應該使用額外內存
  • 不應將其分配給其他變量
+0

爲什麼沒有'memmove'? – sth

+1

http://whathaveyoutried.com/ –

+0

因爲家庭作業,我猜。 – willglynn

回答

3
// this assumes your variable word is really a cstr and is NULL terminated 
// also, it assumes that it's not in read only memory space like your small 
// example shows but is actually in-place writeable 
char* write_position = word; 
char* scan_position = word; 
for(; *scan_position != '\0'; scan_position++) { 
    if(*scan_position == '0') continue; 
    *(write_position++) = *scan_position; 
} 
*write_position = '\0'; 
+0

傑森,幾乎在那裏......但它不能使用額外的變量或指針(你使用'char * scan_position')。 – cybertextron

+0

您帖子中的代碼包含兩個整數變量。局部變量是否允許? – willglynn

+0

'integer'變量當然是允許的。創建'char * word'的副本,使用一個函數來刪除''0''char',將它賦值給一個指針或另一個變量不是。 – cybertextron

3

從開始到結束對字符串進行迭代。對於你發現的每個0,增加一個稱爲偏移的整數,比方說。對於每個非0字符,將其向下移動當前的偏移值。確保在結尾放置一個空字節。

+0

就像我在我的回答中所做的一樣? – cybertextron

4
#include <algorithm> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    char word[] = "abaradasaddragfavvdavgasbga00rarcrawabr0ac0ra0ra0vra0"; 

    int size = strlen(word) + 1; 

    std::remove(word, (sizeof(char) * size) + word, '0'); 
    std::cout << word; 

} 
+0

凱撒,感謝您的回答,但它不應該調用另一個函數來爲我刪除「0」。 – cybertextron

+1

@philippe你應該在原來的帖子中說明。 – Caesar

+0

我認爲現在的問題只是關於C ... –