C - 在不使用int的情况下更快地移动数组

时间:2013-12-05 22:43:59

标签: c arrays sorting

作为我的作业我正在编写一个程序,它应该用bool函数检查char数组并删除返回true的数组中的所有字符。问题是我不允许使用索引(也没有任何类型的int和库)。我写了一个代码来移动我的数组,但它太慢了。 如果有人能指出我更快的方式,我将非常感激。

bool filter(char* array, bool(*function)(char))
{
    if(array)
    {
        char *start = array;
        while(*(array) != 0)
        {
            if(function(*array) == false)
            {
                start++;
                array++;
            }
            else
            {
                while(*(array) != 0)
                {
                    *(array) = *(array + 1);
                    array++;
                }
                *(array) = 0;
                tablica = start;
            }
        }
    }
}

我期待着你的回复。

3 个答案:

答案 0 :(得分:2)

你的教授正在推动你使用指针代替索引。试试这个:

//UNTESTED
void filter(char* array, bool(*function)(char)) {
  char *src;
  char *dest;
  char c;

  src = dest = array;

  while(c = *src++) {
    if (!function(c))
      *dest++ = c;
  }
  *dest = 0;
}

答案 1 :(得分:2)

每次删除字符时都不需要重新移动整个数组。在进行复制时,只需记录当前位置和当前位置的记录。只要不可能将元素添加回数组,就不会覆盖任何内容:

bool filter(char* array, bool(*function)(char)){
    if(array){
        char *start = array;
        while(*(array) != 0){
            if(function(*array) == false){
                *start = *array;
                start++;
            }
            array++
        }
        *start = '\0';
    }
    return true;
}

答案 2 :(得分:0)

K& R风格:

void filter(char *array, bool(*function)(char))
{
    char *dst;
    if(!array) return;

    for (dst=array; *dst = *array++; ) {
        if (function(*dst)) continue;
        dst++;
    }
}