作为我的作业我正在编写一个程序,它应该用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;
}
}
}
}
我期待着你的回复。
答案 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++;
}
}