如何只计算列表中的某些项目?

时间:2012-11-14 01:14:54

标签: c list loops if-statement

我正在尝试允许用户输入姓氏并将其删除,如果有多个人使用相同的姓氏,则用户可以输入名字并删除该特定个人。我的问题是我无法找到一种方法来允许该函数解密是否有多个具有相同姓氏的联系人。我可以让它工作,它只识别多个联系人中的第一个,或所有多个联系人,但不是两个场景。对于前者如果我有一个迈克史密斯,泰德史密斯和菲尔史蒂文的清单,我可以让它删除其中一个史密斯,但不是史蒂文,或者我可以让它删除史蒂文但不只是其中一个史密斯。

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循环循环的标志,但所有这一切都计算它搜索联系人列表(或*计数器)的次数。

有没有办法让函数计算有多少像姓氏一样,所以我可以让程序确定什么时候需要查询名字,什么时候不需要?

3 个答案:

答案 0 :(得分:2)

不是简单地计算匹配数,而是在这里做的最好的事情是有一个第二个列表,你可以在其中添加匹配的索引。这样,当解析结束时,如果这个新列表只有一个元素,则删除它 - 否则,你有原始列表的索引,甚至可以向用户显示所有匹配的条目。

您的逻辑中也存在错误,因为您没有记录最后一个匹配名称的索引(即使只有一个匹配的情况) - 您总是在使用后删除索引“i”的emeent如果只有一场比赛,我会从0计数到“计数器”。

答案 1 :(得分: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;
}

答案 2 :(得分: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");
            }
        }
    }
}

你可以这样试试。