2013-11-02 4 views
0

У меня есть один массив символов, и я хочу удалить символы, которые удовлетворяют моему состоянию. Пример. У меня есть массив символов A = {1, -1,0, 1, -1}, и я хочу удалить элементы, которые равны -1. Это значит, что результат равен {1,0,1}, и я хочу проверить, сколько элементов в массиве. В моем примере - 3. Можете ли вы мне помочь?Удалить char из char * и вернуть char *

char* delete_char(char* sourceArray, char inputChar) 
{ 

    char* out=NULL; 
    //Need to malloc memory. But I don't know how many size will allocate because it depends on how many element that don't equal -1 


    return out; 
} 
int sizeofArray(char* sourceArray) 
{ 
    return size; 
} 
+2

Откуда вы знаете длину входного массива? У вас нет счетчика или, похоже, имеет разделительный символ. Если вам нужно отсканировать массив, чтобы подсчитать его, вы можете вспомнить два счета: один для текущего счета и один для нового значения, не считая символов, которые вы собираетесь удалить. Или просто выделите новый массив того же размера, что и входной массив, если это проще - вы не можете удалить много символов. – Rup

ответ

1

Вы можете написать собственную функцию.

int size(char *ptr) 
{ 

    int offset = 0; 
    int count = 0; 

    while (*(ptr + offset) != '\0') 
    { 
     ++count; 
     ++offset; 
    } 
    return count; 
} 
+0

У меня есть char * A = malloc (5 * sizeof (char)); для (I = 0; I <5; я ++) {А [I] = Rand()% 2;}. И вывод A = {1, -1,0, 1, -1}. И я запускаю ваш размер кода (A) или strlen(), но он возвращается 1. Что происходит? – Jame

3

У вас есть какая-то стратегия:

  • Вычислить точный размер перед выделением.

  • Оцените размер.

  • Выделите память большого размера (вы, вероятно, знаете максимальный размер в худшем случае).

В двух последующих случаях, вы можете использовать realloc, чтобы уменьшить память. В вашем коде оценочный размер равен strlen(sourceArray)+1, если массив является строкой с нулевым завершением, потому что при удалении результат меньше и равен ему.

1

Вы можете сканировать массив, чтобы определить количество элементов, которые вы удаляете, затем выделить и учесть память, а затем скопировать. Например:

int sizeNeeded = 0; 
for (int i = 0; i < sizeofArray(sourceArray; i++) { 
    if (sourceArray[I] != inputChar) sizeNeeded++; 
    } 
char *rv = (char *) malloc(sizeNeeded * sizeOf(char)); 
int j = 0; 
for (int i = 0; i < sizeofArray(sourceArray; i++) { 
    if (sourceArray[I] != inputChar) rv[j++] = sourceArray[i]; 
    } 

Я не пытался скомпилировать этот код, но он должен передать идею

1

Вот оно:

#include <string.h> 

char* delete_char(char* sourceArray, char inputChar) 
{ 
    int iNr = 0,iSize,j = 0; 

    iSize = strlen(sourceArray); 

    for(int i = 0; i < iSize; i++) 
    if(sourceArray[i] == inputChar) 
    iNr ++; 

    char *newarray = new char[iNr +1]; 

    for(int i = 0; i < iSize; i++) 
    { 
     if(sourceArray[i] != inputChar) 
     newarray[j++] = sourceArray[i]; 
    } 

    return newarray; 
} 
int sizeofArray(char* sourceArray) 
{ 
    return strlen(sourceArray); 
} 

PS ПРОВЕРЕНО. Он работает, но может быть не очень эффективным, потому что вы проверяете его 2 раза.

+0

Спасибо каждому органу за ответ. Я знаю размер входного массива. И я уже проверяю с помощью strlen(), но это возврат 1. Что происходит? – Jame

+0

strlen (char_array) возвращает длину массива (несколько символов), которые заканчиваются NULL, например: «abcde hj \ 0», где «\ 0» означает NULL. Здесь strlen вернется 8. Если Null отсутствует в конце, вы можете столкнуться с проблемами. Убедитесь, что вы указали strlen массив! – Mihai

+0

BTW Если ответ верный, не забудьте его выбрать (установите его как ответ). – Mihai

2

Прежде всего, когда вы используете char * в качестве массива, вам также необходимо предоставить информацию о длине этого массива (количество элементов, которое оно содержит). Обычно это делается вторым параметром.

В вашем случае: delete_char(char *inputArray, char inputArraySize, char inputChar).

Затем вы должны выделить свой массив результатов как размер вашего входного массива (поскольку он может содержать не более чем столько элементов, сколько входной массив).

После этого вы должны перебирать каждый элемент входного массива, и если элемент выполняет ваше условие, добавьте его в массив результатов. Конечно, вы должны также указать размер выходного массива (например, в другом выходном параметре), чтобы вы могли работать с ним.

И, наконец, когда вы закончили работу с результирующим массивом, не забудьте освободить всю память (это означает, что он освобождает его, поскольку это был размер исходного входного массива, потому что он является активным).