Как «удалить» элемент из массива строк - PullRequest
2 голосов
/ 13 февраля 2020

Прочитайте много разных ответов, но не могу найти способ это исправить, так что здесь у меня еще вопрос с практическими рекомендациями.

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

Пытался сделать именно это в моей функции removeToDoItem, но я получаю ошибку: присвоение выражения с типом массива. Следовал этому уроку https://codeforwin.org/2015/07/c-program-to-delete-element-from-array.html, но похоже, Я что-то упускаю.

#include <stdio.h>
#define Listsize 10
#define Stringsize 30
#include <string.h>

 void printToDolist(char toDolist[][Stringsize], int placering)
{
    for(int i= 0; i<placering; i++)
        printf("%d - %s\n", i+1, toDolist[i]);
}

int addToDoItem(char toDolist[][Stringsize], int placering)
{
    int i;
    for( i=1; i<=3; i++)
    {
    printf(" Add a note: ");
    fgets(toDolist[i], 30 , stdin);
    }

    return placering+i;
}

int removeToDoItem(char toDolist[][Stringsize], int placering)
{

    int position,i;


    printf(" Which element would you like to remove?: ");
    scanf("%d", &position);

    for(i=position-1; i< placering-1; i++)
    {
        toDolist[i] = toDolist[i+1];

    }
        return placering--;
}

int main ()

{
char toDolist[Listsize][Stringsize] = {[0]= "Buy candy \n"};

int placering = 0;
placering = addToDoItem(toDolist, placering);
printToDolist(toDolist, placering);
removeToDoItem(toDolist, placering);

return 0;
}

Ответы [ 2 ]

1 голос
/ 13 февраля 2020
    for(i=position-1; i< placering-1; i++)
    {
        toDolist[i] = toDolist[i+1]; // wrong: cannot assign to an array
                                     // toDolist[i] is an array of 30 characters
    }

Вы хотите

     for (i = position - 1; i < placering - 1; i++) {
         strcpy(toDolist[i], toDolist[i + 1]);
     }
0 голосов
/ 13 февраля 2020

Используйте strcpy или memcpy вместо toDolist[i] = toDolist[i+1].

Также вы не удаляете элемент должным образом. Если бы вы имели строковый массив: «один», «два», «три». Допустим, вы удалили бы первый элемент «один», в результате массив получился бы «два», три »,« три ». Это может не вызвать проблем для вашей конкретной программы, но может быть лучше установить последний элемент массива пустая строка "" также, чтобы избежать странных результатов.

Также вы не используете возвращаемое значение вашей функции removeToDoItem, чтобы перезаписать старое значение placering новым. А также, если вы return placering--, что произойдет, если он вернет placering, не уменьшив его, так как он постинкрементный. Сделайте это return placering - 1.

...