2012-09-21 81 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 ... –