2

ユーザーが姓を入力して削除できるようにしようとしています。同じ姓の人が複数いる場合、ユーザーは名を入力してその特定の個人を削除できます。私の問題は、同じ姓の連絡先が複数存在するかどうかを機能が解読できるようにする方法を理解できないことです。複数の連絡先の最初の連絡先、またはすべての複数の連絡先のみを認識する場合に機能させることができますが、両方のシナリオは認識できません。例のために。マイク・スミス、テッド・スミス、フィル・スティーブンスのリストがある場合、スミスの 1 人を削除してスティーブンを削除しないようにするか、スティーブンだけを削除してスミスの 1 人だけを削除しないようにすることができます。

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

単純に一致数を数えるのではなく、一致するインデックスを追加する 2 番目のリストを用意するのが最善の方法です。このようにして、解析が終了したときに、この新しいリストに要素が 1 つしかない場合は削除します。それ以外の場合は、元のリストのインデックスがあり、一致するすべてのエントリをユーザーに提示することもできます。

最後に一致した名前のインデックスを記録しないという点で、ロジックにもエラーがあります (1 つしかない場合でも) - i を使用してカウントした後、常にインデックス "i" の emeent を削除します単一の一致がある場合は、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 に答える