как удалить строку в 2d массив символов - PullRequest
0 голосов
/ 22 мая 2018

Для заданного 2d массива символов или, другими словами, для массива строк с заданным размером, например:

char array[100][6];

, и массив заполняется следующим образом:

{"john", "mark", "megan"} and so on...

Как я могу удалить данное слово?Например, удаляя «mark».

Я где-то читал, что мы должны заменить строку, которую нужно удалить, следующей.

Код, который у меня есть на данный момент:

void remove_string(char array[100][6], char *string, int array_size){
    for(int i = 0; i < array_size; i++){
        if(strcmp(array[i], string) == 0){
            for(int j = i; j < array_size; j++){
                strcpy(array[j], array[j+1]);
            }
        }
    }
}

Ожидаемый результат после удаления "mark":

{"john", "megan"}

Код работает, но можно ли это сделать без использования другого цикла?

Я также думал о копировании всехслова, за исключением одного, которое нужно удалить в другой массив и вернуть новый массив, но я не могу найти только копирование «других слов».

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

вы не можете "удалить" строку из таблицы такого типа.Вы можете сделать его только нулевым размером

char *remove_string(char *arr, size_t nstrings, size_t strlength, size_t string)
{
    if (!arr || string >= nstrings) retun NULL;
    arr[strlrength * string] = 0;
    return arr + strlrength * string
}

и таким же с таблицей указателей символов ** (при условии, что для строк было выделено пространство).Это не будет работать, если вы назначили указатели с адресами строковых литералов ReadOnly.

char *remove_string_from_table_of_pointers(char **arr, size_t nstrings, size_t string)
{
    if (!arr || string >= nstrings) retun NULL;
    if(arr[string]) arr[string][0] = 0;
    return arr[string];
}

Если строки были «неправильными», вы также можете полностью удалить строку, освобождая память

int completely_remove_string_from_table_of_pointers(char **arr, size_t nstrings, size_t string)
{
    if (!arr || string >= nstrings) retun -1;
    if(arr[string]) free(arr[string]);
    arr[string] = NULL;
    return 0;
}
0 голосов
/ 22 мая 2018

У вас уже есть цикл в вашей функции, который перебирает элементы.Вы можете использовать тот же цикл, чтобы удалить элементы на месте.

Вам нужно еще одно целое число при итерации.Это целое число будет содержать индекс, куда текущий элемент должен быть перемещен в массиве.

В вашей функции объявите новое целое число как -

int new_position = 0;

Теперь внутри вашего цикла вы обычно проверяетеесли строка соответствует строке удаления -

for (int i = 0; i < array_size; i++) {
    if (strcmp(array[i], string) == 0) {
        // Do nothing. and continue
        continue;       
    }
    if (new_position != i) {
        //Move the other elements 
        array[new_position] = array[i];
    }
    new_position++;
}

array_size = new_position; 

Это также автоматически сохранит порядок элементов и удалит все соответствующие элементы.

0 голосов
/ 22 мая 2018

Вы не можете удалять элементы из массивов фиксированного размера.Вам нужно будет переместить все элементы из индекса n и дальше на один шаг вперед в массиве, переписав предыдущий.

Это довольно неэффективно, и именно поэтому были изобретены связанные списки: они гораздо более удобны, чем массивы, когда нужно добавлять / удалять элементы в середине контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...