Как удалить элемент 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. в следующий раз пожалуйста не скидывайте код, который никак не влияет на ошибку или проблему :)