2013-12-05 2 views
1

как мое назначение Я пишу программу, которая должна проверять массив символов с помощью функции bool и удалять все символы в массиве, которые возвращают true. Дело в том, что мне не разрешено использовать индексирование (и любые типы int и библиотеки). Я написал код, который меняет мой массив, но он слишком медленный. Буду очень признателен, если кто-нибудь может указать мне на быстрый способ сделать это.C - более быстрый способ смещения массива без использования 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

Если у меня есть функция Ей, которая возвращает истину для ' e ', тогда вы превратите «steampower» в «st \ 0ampow \ 0r» или еще хуже. Я предполагаю, что ответ должен быть «штамп». Тогда есть факт, что вы, кажется, не используете начало для чего-либо, кроме как назначить таинственную переменную tablica. – woolstar

+0

@GrahamBorland else принадлежит к if внутри цикла. – chuthan20

+0

Отступ плохой, но скобки правильные. –

ответ

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; 
} 
+0

Это действительно полезно. Спасибо. – Doe

+0

Рад, что я мог помочь. Были в одной обуви. Еще во многих других областях ... –

+0

@Mad Physicist Посмотрите отлично! Незначительный вопрос: почему вы увидели необходимость тестирования 'array', а не' function'? Я ожидал, что оба или ни один из них не будет протестирован (или заявлен). – chux

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; 
} 
+0

Это похоже на реальный C – Justin

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++; 
    } 
} 
Смежные вопросы