Step 17: Implement Search by Contact Name

Medium Section 4: Search Module
Solve in Playground →

Problem Statement

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.

Input Format

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.

Output Format

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.

Constraints

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.

Sample Input

1
101
Alice Johnson
1234567890
3
2
Alice Johnson
0

Sample Output

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

Explanation

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.

Starter Code

#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;
}

Limits

  • Time Limit: 1s
  • Memory Limit: 256MB

Embedded C Programming

Updated: March 15, 2026
Intermediate

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