Extend the existing search framework with name-based searching while preserving the complete ID-search implementation from Task 16. When search mode 2 is selected, read a full contact name including spaces and perform a linear search using strcmp() against the stored names. For a match, print the complete matching contact. When no contact matches, print Contact Not Found. The existing ID-search branch, Add Contact module, Display module, and permanent menu loop must remain unchanged.
Complete Add Contact operations may be performed first. Menu choice 3 opens Search, followed by search mode 2 and a full contact name on the next line. The application finally receives 0.
For an existing name, print Found Contact followed by ID: [id], Name: [name], and Phone: [phone]. For a missing name, print Contact Not Found. Search mode 1 must continue to perform the previously implemented ID search.
Name matching is exact and case-sensitive. Names may contain spaces. The search must examine only active records from index 0 through contact_count - 1.
1 101 Alice Johnson 1234567890 3 2 Alice Johnson 0
Contact Book Ready.
Phonebook Capacity: 100
Contacts: 0
Menu:
Add
ID: 101
Valid ID
Name: Alice Johnson
Phone: 1234567890
Valid Phone
Contact Added
Menu:
Search
Search Mode: Name
Found Contact
ID: 101
Name: Alice Johnson
Phone: 1234567890
Menu:
Exit
The second search branch adds exact name matching without disturbing the ID-search implementation created in Task 16. Using strcmp() allows the module to distinguish complete names, including names containing spaces.
#include <stdio.h>
#include <string.h>
struct Contact {
int id;
char name[50];
char phone[15];
};
struct Contact phonebook[100];
int contact_count = 0;
void add_contact();
void display_contacts();
void search_contact();
void update_contact();
void delete_contact();
void add_contact() {
if (contact_count >= 100) {
printf("\nPhonebook Full");
return;
}
int id;
if (scanf("%d", &id) == 1) {
printf("\nID: %d", id);
if (id > 0) {
printf("\nValid ID");
{
int duplicate = 0;
for (int i = 0; i < contact_count; i++) {
if (phonebook[i].id == id) {
duplicate = 1;
break;
}
}
if (duplicate) {
printf("\nDuplicate ID");
return;
}
}
getchar();
if (fgets(phonebook[contact_count].name,
sizeof(phonebook[contact_count].name), stdin) != NULL) {
phonebook[contact_count].name[
strcspn(phonebook[contact_count].name, "\n")
] = '\0';
printf("\nName: %s", phonebook[contact_count].name);
{
char phone_input[100];
if (fgets(phone_input, sizeof(phone_input), stdin) != NULL) {
phone_input[
strcspn(phone_input, "\n")
] = '\0';
printf("\nPhone: %s", phone_input);
if (strlen(phone_input) >= 1 &&
strlen(phone_input) <= 14) {
strcpy(phonebook[contact_count].phone, phone_input);
printf("\nValid Phone");
phonebook[contact_count].id = id;
contact_count++;
printf("\nContact Added");
} else {
printf("\nInvalid Phone");
}
}
}
}
} else {
printf("\nInvalid ID");
}
}
}
void display_contacts() {
if (contact_count == 0) {
printf("\nPhonebook Empty");
return;
}
printf("\nID Name Phone");
for (int i = 0; i < contact_count; i++) {
printf("\n%d %s %s",
phonebook[i].id,
phonebook[i].name,
phonebook[i].phone);
}
}
void search_contact() {
int mode;
if (scanf("%d", &mode) != 1) {
return;
}
switch (mode) {
case 1:
printf("\nSearch Mode: ID");
{
int search_id;
int found = 0;
if (scanf("%d", &search_id) == 1) {
for (int i = 0; i < contact_count; i++) {
if (phonebook[i].id == search_id) {
found = 1;
printf("\nFound Contact");
printf("\nID: %d", phonebook[i].id);
printf("\nName: %s", phonebook[i].name);
printf("\nPhone: %s", phonebook[i].phone);
break;
}
}
if (!found) {
printf("\nContact Not Found");
}
}
}
break;
case 2:
printf("\nSearch Mode: Name");
// Write your code here
break;
default:
printf("\nInvalid Search Mode");
break;
}
}
void update_contact() {
}
void delete_contact() {
}
int main() {
int choice;
printf("Contact Book Ready.");
printf("\nPhonebook Capacity: %d", 100);
printf("\nContacts: %d", contact_count);
while (1) {
printf("\nMenu:");
if (scanf("%d", &choice) != 1) {
break;
}
switch (choice) {
case 1:
printf("\nAdd");
add_contact();
break;
case 2:
printf("\nDisplay");
display_contacts();
break;
case 3:
printf("\nSearch");
search_contact();
break;
case 4:
printf("\nUpdate");
update_contact();
break;
case 5:
printf("\nDelete");
delete_contact();
break;
case 0:
printf("\nExit");
return 0;
default:
printf("\nInvalid Choice");
break;
}
}
return 0;
}Embedded systems rely on efficient low-level programming to interact directly with hardware. In this course, you will learn how to write practical Embedded C programs used in real microcontroller-based systems. Rather than focusing only on theory, this course follows a practice-driven approach. Each lesson includes hands-on coding exercises that simulate real firmware development tasks used