Удалить пользователя в программе Struct массива

Я работаю в программе массива структур, чтобы сделать несколько простых пользовательских приложений. Ниже приведен компилируемый код, это не полный код, но он показывает, что функция удаления пользователя не работает. Я новичок в C, и я не уверен, как сделать это удаление пользователя. Я думал о чем-то, связанном с нулевым массивом, но это не сработало. Программа просит ввести имя, поэтому пользователь будет удален.

    #include<stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define max_users 50

    int num = 0; //variable to count the number of users

    typedef struct
    {
        char name[50];
        int age;
    }user;

    user number[max_users];
    user aux[max_users];

    user read_user()
    {
        user user;

        printf("\nEnter your name: ");
        scanf("%s", &(user.name));

        printf("\nEnter your age: ");
        scanf("%d",&(user.age));

        return user;

    }
    void printUser(user user)
    {
        printf("\n-----------------------\n");
        printf("\nName: %s", user.name);
        printf("\nAge: %d", user.age);
    }

    void enterUser()
    {
        number[num] = read_user();
        printUser(number[num]);
        num++;
    }

    void printAllUsers()
    {
        for(int i = 0; i < num; i++)
        {
            printUser(number[i]);
        }
    }

    void performUserRemotion(char name[])
    {
        char null[50] = {"\0"};

        for (int i = 0; i < num; i++) {
            if (strcmp(name, number[i].name) == 0)
            {
                strcpy(number[i].name, null);
                printf("\n*** User removed ***");
                i--;
            }
            else
            {
                printf("\n*** No user ***");
                break;
            }
        }
    }
    void removeUser()
    {
        char name_search[50];
        int i;

        printf("Enter the user to be removed: ");
        scanf("%s", &name_search);
        performUserRemotion(name_search);
    }

    int main()
    {
        int choice;

        while(1)
        {
            printf("\n\nRECORD: ");
            printf("\n1) Enter User");
            printf("\n2) Remove User");
            printf("\n3) Print all users");
            printf("\n4) Exit");

            printf("\n\nEnter the command >> ");
            scanf(" %d", &choice);

            switch(choice)
            {
                case 1:
                    enterUser();
                    break;
                case 2:
                    removeUser();
                    break;
                case 3:
                    printAllUsers(num);
                    break;
                case 4:
                    printf("\n*** Exit ***\n");
                    exit(0);
                    break;

            }
        }
    }

В функции ниже я планировал удалить всю информацию о пользователе, поэтому когда я ввожу 3) Печатать всех пользователей, удаленный пользователь больше не появляется и массив уменьшается на 1.

void performUserRemotion(char name[])
{
    char null[50] = {"\0"};

    for (int i = 0; i < num; i++) {
        if (strcmp(name, number[i].name) == 0)
        {
            strcpy(number[i].name, null);
            printf("\n*** User removed ***");
            i--;
        }
        else
        {
            printf("\n*** No user ***");
            break;
        }
    }
}

Изображения A и B — это регистрации пользователя. Изображение C - это когда вы вводите команду для удаления пользователя, в этом случае я зарегистрировал «пользователя» и «имя» и хотел, чтобы «пользователь» был удален, поэтому, когда я ввожу 3) Печатать всех пользователей, на экране отображается только « имя'.

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

Что именно означает «не работает»?

mkrieger1 20.12.2020 23:49

Привет! Это отличный вопрос для начинающих. Ваш текущий код C имеет пользовательскую структуру, которая содержит 50 байтов для массива символов и еще один sizeof(int) bytes. Хотя есть вещи, на которые я могу ответить о семантике языка программирования C, я думаю, что это также вопрос разработки программного обеспечения. Как вы хотите количественно оценить удаляемого пользователя? Идея «нулевого массива» на самом деле не то, что вы можете здесь сделать. Вы можете заполнить весь массив нулями, но, вероятно, есть более простой способ выполнить то, что вы пытаетесь сделать. Как насчет логического значения, указывающего на активность пользователя?

baseman101 20.12.2020 23:51

Пожалуйста, отредактируйте свой вопрос и покажите, какие входные данные вы используете, фактический результат или поведение, которое вы получаете, и ожидаемый результат или поведение, которое вы хотели бы получить. Если непонятно, объясните, что не так с фактическим выводом.

Bodo 20.12.2020 23:56

@Bodo Я отредактировал вопрос, надеюсь, теперь он более понятен.

欲しい未来 21.12.2020 00:19

@mkrieger1 mkrieger1 Я отредактировал вопрос, надеюсь, теперь он более понятен.

欲しい未来 21.12.2020 00:20
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
5
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Логика удаления пользователя неверна, потому что когда вы печатаете всех пользователей, вы печатаете все содержимое массива. Итак, чтобы удалить пользователя, у вас должно быть где-то num = num - 1;.

Простой способ — найти индекс пользователя, которого нужно удалить, а затем последовательно удалить каждую запись со следующей:

void performUserRemotion(char name[])
{
    char null[50] = { "\0" };
    int i;
    // find the name
    for (i = 0; i < num; i++) {
        if (strcmp(name, number[i].name) == 0)
        {
            break;
        }
    }
    if (i == num) {
        printf("\n*** No user ***");
    }
    else {
        // remove the user from the array
        for (; i < num - 1; i++) {
            memcpy(number + i, number + i + 1, sizeof(*number));
        }
        num -= 1;
        printf("\n*** User removed ***");
    }
}

У вас еще есть ряд мелких проблем вроде неиспользуемых переменных, так что когда все заработает, стоит попросить полный обзор на Code Review

Другие вопросы по теме