关于简易通讯录程序的一些问题

如下是一个简易通讯录程序

#include 
#include 
#include 
#include 




struct Information
{
    char name[255];
    char number[255];
    char email[255];
    char department[255];
}Information;


struct Contact_list
{
    int sizeofContact;
    struct Information context[500];
};


static int SearchNumber (const struct Contact_list *a, char number[255])
{
    int i = 0;
    for(i = 0; i < a->sizeofContact; i++)
    {
        if(0 == strcmp(a->context[i].number, number))
        {
            return i;
        }
    }
    return -1;
}


static int SearchName (const struct Contact_list *a, char name[255])
{
    int i = 0;
    for(i = 0; i < a->sizeofContact; i++)
    {
        if(0 == strcmp(a->context[i].name, name))
        {
            return i;
        }
    }
    return -2;
}


static int SearchEmail (const struct Contact_list *a, char email[255])
{
    int i = 0;
    for(i = 0; i < a->sizeofContact; i++)
    {
        if(0 == strcmp(a->context[i].email, email))
        {
            return i;
        }
    }
    return -3;
}


static int SearchDepartment (const struct Contact_list *a, char department[255])
{
    int i = 0;
    for(i = 0; i < a->sizeofContact; i++)
    {
        if(0 == strcmp(a->context[i].department, department))
        {
            return i;
        }
    }
    return -4;
}


void Print_contact_list (const struct Contact_list *a)
{
    int i = 0;
    for (i = 0; i < a->sizeofContact; i++)
    {
        printf("%s\t%s\t%s %s\n",a->context[i].number,a->context[i].email,a->context[i].name,a->context[i].department);
    }
}


void Add_a_contact (struct Contact_list *a)
{
    char name[255];
    char number[255];
    char email[255];
    char department[255];
    int p = 0;
    int q = 0;
    int r = 0;
    int s = 0;
    getchar();
    printf("Name:");
    scanf("%[^\n]",a->context[a->sizeofContact].name);
    strcpy(name,a->context[a->sizeofContact].name);
    printf("Number:");
    scanf("%s",a->context[a->sizeofContact].number);
    strcpy(number,a->context[a->sizeofContact].number);
    printf("Email:");
    scanf("%s",a->context[a->sizeofContact].email);
    strcpy(email,a->context[a->sizeofContact].email);
    getchar();
    printf("Department:");
    scanf("%[^\n]",a->context[a->sizeofContact].department);
    strcpy(department,a->context[a->sizeofContact].department);
    p = SearchName(a,name);
    q = SearchNumber(a,number);
    r = SearchEmail(a,email);
    s = SearchDepartment(a,department);
    if (p != -2 & q != -1 & r != -3 & s != -4)
    {
        a->sizeofContact++;
        int x = SearchNumber(a, number);
        int y = 0;
        for(y = x; y < a->sizeofContact-1; y++)
        {
            a->context[y] = a->context[y + 1];
        }
        a->sizeofContact--;
        printf("Entry already exists, ignoring duplicate entry.\n");
    }
    else
    {
        a->sizeofContact++;
    }
}


void Modify_a_contact (struct Contact_list *a)
{
    char number[255];
    printf("Enter phone number to modify:");
    scanf("%s", number);
    int x = SearchNumber(a, number);
    if (x == -1)
    {
        printf("Entry does not exist.\n");
    }
    else
    {
        getchar();
        printf("Enter new name (return to keep [%s]): ", a->context[x].name);
        scanf("%[^\n]",a->context[x].name);
        printf("Enter new number (return to keep [%s]): ", a->context[x].number);
        scanf("%s", a->context[x].number);
        printf("Enter new email (return to keep [%s]): ", a->context[x].email);
        scanf("%s", a->context[x].email);
        getchar();
        printf("Enter new department (return to keep [%s]): ", a->context[x].email);
        scanf("%[^\n]",a->context[x].email);
    }
}


void Delete_a_contact (struct Contact_list *a)
{
    char number[255];
    printf("Enter phone number to delete (return to cancel): ");
    scanf("%s", number);
    int x = SearchNumber(a, number);
    int y = 0;
    for(y = x; y < a->sizeofContact-1; y++)
    {
        a->context[y] = a->context[y + 1];
    }
    a->sizeofContact--;
    printf("Successfully deleted the entry for %s\n", number);
}


void Search (struct Contact_list *a)
{
    char search[255];
    int x = 0;
    printf("Search:");
    scanf("%s", search);
    while (x <= a->sizeofContact) {
        if (0 != strstr(a->context[x].name, search))
        {
            printf("%s\t%s\t%s %s\n", a->context[x].number, a->context[x].email, a->context[x].name,
                   a->context[x].department);
            x++;
        }
        else if (0 != strstr(a->context[x].number, search))
        {
            printf("%s\t%s\t%s %s\n", a->context[x].number, a->context[x].email, a->context[x].name,
                   a->context[x].department);
            x++;
        }
        else if (0 != strstr(a->context[x].email, search))
        {
            printf("%s\t%s\t%s %s\n", a->context[x].number, a->context[x].email, a->context[x].name,
                   a->context[x].department);
            x++;
        }
        else if (0 != strstr(a->context[x].department, search))
        {
            printf("%s\t%s\t%s %s\n", a->context[x].number, a->context[x].email, a->context[x].name,
                   a->context[x].department);
            x++;
        }
        else
        {
            x++;
        }
    }
}


void menu()
{
    printf("1) Print contact list\n");
    printf("2) Add a contact\n");
    printf("3) Modify a contact\n");
    printf("4) Delete a contact\n");
    printf("5) Search\n");
    printf("6) Quit\n");
}


int main()
{
    int x = 0;
    struct Contact_list C;
    do {
        menu();
        printf("Option:");
        scanf("%d",&x);
        if(x > 6)
        {
            printf("Unknown option!\n");
        }
        else
        {
            switch (x)
            {
                case 1:
                    Print_contact_list(&C);
                    break;
                case 2:
                    Add_a_contact(&C);
                    break;
                case 3:
                    Modify_a_contact(&C);
                    break;
                case 4:
                    Delete_a_contact(&C);
                    break;
                case 5:
                    Search(&C);
                    break;
                case 6:
                    return 0;
            }
        }
    } while (x);
    return 0;
}

现在出现了两个问题,一是在Modify_a_contact、Delete_a_contact中,要求按回车来实现一些功能,具体来讲,Modify_a_contact中要求按回车取消对信息的修改保留原值,Delete_a_contact中要求按回车取消删除返回menu,初学者请问该如何实现这些功能?

Modify_a_contact函数:

void Modify_a_contact (struct Contact_list *a)
{
    char number[255];
    printf("Enter phone number to modify:");
    scanf("%s", number);
    int x = SearchNumber(a, number);
    if (x == -1)
    {
        printf("Entry does not exist.\n");
    }
    else
    {
        getchar();
        printf("Enter new name (return to keep [%s]): ", a->context[x].name);
        scanf("%[^\n]",a->context[x].name);
        printf("Enter new number (return to keep [%s]): ", a->context[x].number);
        scanf("%s", a->context[x].number);
        printf("Enter new email (return to keep [%s]): ", a->context[x].email);
        scanf("%s", a->context[x].email);
        getchar();
        printf("Enter new department (return to keep [%s]): ", a->context[x].email);
        scanf("%[^\n]",a->context[x].email);
    }
}

Delete_a_contact函数:

void Delete_a_contact (struct Contact_list *a)
{
    char number[255];
    printf("Enter phone number to delete (return to cancel): ");
    scanf("%s", number);
    int x = SearchNumber(a, number);
    int y = 0;
    for(y = x; y < a->sizeofContact-1; y++)
    {
        a->context[y] = a->context[y + 1];
    }
    a->sizeofContact--;
    printf("Successfully deleted the entry for %s\n", number);
}

另一个问题是,在主函数里有一步用来检查用户输入的option是否有效

 if(x > 6)
        {
            printf("Unknown option!\n");
        }

在这一步中,如果输入大于6的数字程序会回到menu重新开始,但程序同样应该检查用户是否输入了字母,如果输入字母也应该报错并退回menu重新开始,初学者请问应该如何处理字母输入的问题?

scanf 函数有返回值,如果返回0,说明输入的参数类型不匹配。