2

我试图允许用户输入姓氏并将其删除,如果有多个姓氏相同的人,则用户可以输入名字并删除该特定个人。我的问题是我无法找到一种方法来允许该函数破译是否有多个具有相同姓氏的联系人。我可以让它在它只识别多个联系人中的第一个或所有多个联系人的情况下工作,但不能同时识别这两种情况。例如。如果我有一个 mike smith、ted smith 和 phil stevens 的列表,我可以让它删除其中一个 smiths,但不删除 stevens,或者我可以让它删除 stevens 而不仅仅是其中一个 smiths。

typedef struct friends_contact{

   char *First_Name;
   char *Last_Name;
   char *home;
   char *cell;
}fr;

上面是结构,下面显然是剩下的代码

char delete_contact(fr*friends ,int* counter, int i)
{
    char name_search[50]={'\0'};
    char name_search3[50]={'\0'};
    char Delete[5]={'\0'};
    int flag=0;

    printf("Search by last name\n");
    scanf("%s",name_search);//Name entry

    for(i=0;i<*counter;i++)
    {
        if(strcmp(name_search,friends[i].Last_Name)==0)//Copys over the name entered
            flag++;
    }
    if(flag<=1)
    {
        strcpy(friends[i].Last_Name,Delete);
        printf("Name was deleted");
    }
    if(flag>1)
    {
        printf("There is more then 1 " "%s " ",please enter a first name\n",name_search);
        scanf("%s",name_search3);
        for (i=0;i<*counter;i++)
        {
            if(strcmp(name_search3,friends[i].First_Name)==0)
            {
                strcpy(friends[i].First_Name,Delete);
                printf("Name was deleted");
            }
        }
    }

    free(friends[i].First_Name);
    free(friends[i].Last_Name);
    free(friends[i].home);
    free(friends[i].cell);
}

我试图使用一个标志,该标志计为第一个for循环循环,但所做的只是计算它搜索联系人列表(或*计数器)的次数。

有没有办法让函数计算有多少类似的姓氏,这样我就可以让程序确定何时需要询问名字,何时不需要?

4

3 回答 3

2

与其简单地计算匹配的数量,最好的办法是创建第二个列表,在其中添加匹配的索引。这样,当解析结束时,如果这个新列表只有一个元素,请将其删除 - 否则,您将拥有原始列表的索引,甚至可以将所有匹配的条目呈现给用户。

您的逻辑也有一个错误,因为您没有记录最后一个匹配名称的索引(即使只有一个) - 在使用 i 计数后,您总是删除索引“i”的元素如果有一个匹配项,则从 0 到“计数器”。

于 2012-11-14T01:21:19.093 回答
0

自己检查内存泄漏。我不会用勺子喂你。:)

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

typedef struct friends_contact{

   char *First_Name;
   char *Last_Name;
   char *home;
   char *cell;
}fr;

void delete_contact(fr *friends ,int counter)
{
    char name_search[50]={'\0'};
    char name_search3[50]={'\0'};

    int flag=0;
    int i;

    printf("Search by last name\n");
    scanf("%s",name_search);//Name entry

    for(i=0;i<counter;i++)
    {
        if(strcmp(name_search,friends[i].Last_Name)==0)//Copys over the name entered
            flag++;
    }
    if(flag==1)
    {

       friends[i].Last_Name = NULL;
        printf("Name was deleted");
    }
    if(flag>1)
    {
        printf("There is more then 1 " "%s " ",please enter a first name\n",name_search);
        scanf("%s",name_search3);
        for (i=0;i<counter;i++)
        {
            if(strcmp(name_search3,friends[i].First_Name)==0)
            {
                friends[i].Last_Name = NULL;
                printf("Name was deleted");
            }
        }
    }


}


int main()
{
    fr arr[3];

    arr[0].First_Name = "john";
    arr[1].First_Name = "jack";
    arr[2].First_Name = "jake";


    arr[0].Last_Name = "smith";
    arr[1].Last_Name = "smith";
    arr[2].Last_Name = "fox";

    delete_contact(arr,3);

    return 0;
}
于 2012-11-14T01:57:53.657 回答
0
char delete_contact(fr*friends ,int* counter, int i)
{
    char name_search[50]={'\0'};
    char name_search3[50]={'\0'};
    char Delete[5]={'\0'};
    int flag=0;

    printf("Search by last name\n");
    scanf("%s",name_search);//Name entry

    for(i=0;i<*counter;i++)
    {
        if(strcmp(name_search,friends[i].Last_Name)==0)//Copys over the name entered
            flag++;
    }
    if(flag == 1)
    {
        strcpy(friends[i].Last_Name,Delete);

        free(friends[i].First_Name);
        free(friends[i].Last_Name);
        free(friends[i].home);
        free(friends[i].cell);

        printf("Name was deleted");
    }
    if(flag>1)
    {
        printf("There is more then 1 " "%s " ",please enter a first name\n",name_search);
        scanf("%s",name_search3);
        for (i=0;i<*counter;i++)
        {
            if((strcmp(name_search3,friends[i].First_Name)==0) && (strcmp(name_search,friends[i].Last_Name) == 0))
            {
                strcpy(friends[i].First_Name,Delete);

                free(friends[i].First_Name);
                free(friends[i].Last_Name);
                free(friends[i].home);
                free(friends[i].cell);

                 printf("Name was deleted");
            }
        }
    }
}

你可以这样试试。

于 2012-11-14T03:16:50.900 回答