Как удалить элемент char из структуры? (PhoneBook project)

Я создаю проект телефонной книги, и у меня проблема с удалением контакта из телефонной книги. Функция удаления есть в "case 2". Вот мой код:

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

struct contact {
    char name[30];
    char number[12];
    char changedname[30];
    char changednumber[12];
};

int main() {
    struct contact contact[101];
    int option;
    int n = 0;
    int i, j, p, q, flag_1, flag_2, flag_3, flag_4, flag_5, flag_6, flag_7 ,flag_8, loop;
    char temp[30];
    do {
        loop = 0;
        printf("Telephone Book\n\n");
        printf("1. Add New Contact\n");
        printf("2. Delete contact\n");
        printf("3. Change contact\n");
        printf("4. View Contact List\n");
        printf("0. Exit\n\n");
        printf("Choose option: ");
        scanf("%d", &option);
        system("cls");

        switch (option) {
        case 1:
            printf("Add New Contact\n");
            do {
                flag_1 = flag_2 = 1;
                printf("Input name [1 - 30 char]: ");
                scanf(" %[^\n]", contact[n].name);

                if (strlen(contact[n].name) > 30) {
                    printf("Length of name should be between 1 and 30 characters.\n");
                    flag_1 = 0;
                }

                if (!isalpha(contact[n].name[0])) {
                    printf("First letter of name should be an alphabet (A-Z od a-z).\n");
                    flag_1 = 0;
                }

            } while (flag_1 == 0 || flag_2 == 0);

            do {
                flag_3 = flag_4 = 1;
                printf("Input phone number [6..12 digits]: ");
                scanf("%s", contact[n].number);

                if (strlen(contact[n].number) < 6 || strlen(contact[n].number) > 12) {
                    printf("Length of phone numbers should be between 6 and 12 digits.\n");
                    flag_3 = 0;
                }

                for (i = 0; i < strlen(contact[n].number); i++) {
                    if (!isdigit(contact[n].number[i])) {
                        flag_4 = 0;
                    }
                }
                if (flag_4 == 0) {
                    printf("Phone numbers should only contain digits (0-9).\n");
                }
            } while (flag_3 == 0 || flag_4 == 0);

            printf("\n");
            printf("New contact successfully added!\n\n");
            printf("Index of the number is: %d\n", n);
            printf("Name : %s\n", contact[n].name);
            printf("Number : %s\n\n", contact[n].number);
            printf("Press Enter to continue...");
            n++;
            getchar();
            getchar();
            system("cls");
            loop = 0;
            break;


        case 2:
            printf("Type index number of the contact you want to delete: ");
            scanf("%d\n", q);
            for(i = 0; i != q; i++)
                {
                    strcpy(contact[i].name, contact[i+1].name);
                    strcpy(contact[i].number, contact[i+1].number);
                }

        case 3:
            do {
                printf("Type index number of the contact: ");
                scanf("%d\n", &p);
                p = 0;
                flag_5 = flag_6 = 1;
                printf("Type new name: ");
                scanf(" %[^\n]", contact[j].changedname);
                strcpy(contact[p].name, contact[p].changedname);
                if (strlen(contact[p].name) > 30) {
                    printf("Length of name should be between 1 and 30 characters.\n");
                    flag_5 = 0;
                }

                if (!isalpha(contact[p].name[0])) {
                    printf("First letter of name should be an alphabet (A-Z od a-z).\n");
                    flag_5 = 0;
                }

            } while (flag_5 == 0 || flag_6 == 0);

            do {
                flag_7 = flag_8 = 1;
                printf("Input new phone number [6..12 digits]: ");
                scanf("%s", contact[p].changednumber);
                strcpy(contact[p].number, contact[p].changednumber);

                if (strlen(contact[p].number) < 6 || strlen(contact[p].number) > 12) {
                    printf("Length of phone numbers should be between 6 and 12 digits.\n");
                    flag_7 = 0;
                }

                for (i = 0; i < strlen(contact[p].number); i++) {
                    if (!isdigit(contact[p].number[p])) {
                        flag_8 = 0;
                    }
                }
                if (flag_8 == 0) {
                    printf("Phone numbers should only contain digits (0-9).\n");
                }
            } while (flag_7 == 0 || flag_8 == 0);

            printf("\n");
            printf("Contact successfully changed!\n\n");
            printf("%d\n", p);
            printf("Name : %s\n", contact[p].name);
            printf("Number : %s\n\n", contact[p].number);
            printf("Press Enter to continue...");
            getchar();
            getchar();
            system("cls");
            loop = 0;
            break;

        case 4:
            printf("View List Contact\n\n");
            /*for (i = 0; i < n; i++) {
                for (j = 0; j < n - 1; j++) {
                    if (strcmp(contact[j].name, contact[j + 1].name) > 0) {
                        strcpy(temp, contact[j].name);
                        strcpy(contact[j].name, contact[j + 1].name);
                        strcpy(contact[j + 1].name, temp);

                        strcpy(temp, contact[j].number);
                        strcpy(contact[j].number, contact[j + 1].number);
                        strcpy(contact[j + 1].number, temp);

                    }
                }
            }*/
            printf("     # Name                            Phone Number\n");
            for (i = 0; i < n; i++) {
                printf("    %d %s                 %s\n", i + 1, contact[i].name, contact[i].number);
            }

            getchar();
            getchar();
            system("cls");
            loop = 0;
            break;

            case 0:
                exit(0);
        }

    } while (loop == 0);
    getchar();
    return 0;
}

Ответы (1 шт):

Автор решения: Павел Ериков

Нужно сначала заменить qую запись на q + 1 и т.д.

Вот пример кода:

printf("Type index number of the contact you want to delete: ");
        scanf("%d", &q);

        for (i = q; i < n - 1; ++i) {
            strcpy(contact[i].name, contact[i + 1].name);
            strcpy(contact[i].number, contact[i + 1].number);
        }

        --n;
        system("cls");
        loop = 0;
        break;

По очереди начиная с индекса q заменяем запись на q + 1.

И обязательно уменьшить размер телефонной книги.

P.S. в следующий раз пожалуйста не скидывайте код, который никак не влияет на ошибку или проблему :)

→ Ссылка