【问题标题】:How can I count only certain items in a list?如何仅计算列表中的某些项目?
【发布时间】:2012-11-02 12:39:00
【问题描述】:

我正在尝试允许用户输入姓氏并将其删除,如果有多个姓氏相同的人,则用户可以输入名字并删除该特定个人。我的问题是我无法找到一种方法来允许该函数破译是否有多个具有相同姓氏的联系人。我可以让它在它只识别多个联系人中的第一个或所有多个联系人的情况下工作,但不能同时识别这两种情况。例如。如果我有一个 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 循环循环,但所做的只是计算它搜索联系人列表(或*计数器)的次数。

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

【问题讨论】:

  • fr 的结构定义将是这篇文章的一个很好的补充。
  • 我已经添加了结构
  • 为什么有 if (flag
  • 我已经尝试了两个示例,但都没有产生我需要的结果,这只是我在此处发布之前尝试的最后一个示例。
  • @DatDudeJC,我的程序不符合您的要求吗?我可能误解了你的问题。

标签: c list loops if-statement


【解决方案1】:
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");
            }
        }
    }
}

你可以这样试试。

【讨论】:

  • 输入不重复的名称后程序会立即崩溃。例如 3 个名字,smith,smith, jones, smith 工作正常,但 jones 崩溃
  • 是的,你是对的。很容易修改。我可以添加一个变量来记录第一个等于姓氏的成员。这样如果flag == 1,它就会起作用。请原谅我,我的英语很差。
  • 您能否编辑您的帖子以反映您所说的内容,以便我确保我理解您所说的内容?
  • int search_flag = 0; for(i=0;i
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多