【问题标题】:removing duplicated names for array in c在c中删除数组的重复名称
【发布时间】:2021-07-23 07:13:27
【问题描述】:

这是我必须做的:c。应该可以删除具有指定名称的动物。如果存在更多同名动物,则应删除所有同名动物。

这是我的代码:

void deleteAnimalByName(char *animalName, int *nrOfAnimals, ANIMAL *animalArray)
{
   for(int i = 0; i < *nrOfAnimals; i ++)
   {
       if(strcmp((animalArray + i)->Name, animalName) == 0)
       {
           for(int j = i; j < *nrOfAnimals - 1; j++)
           {
            animalArray[j] = animalArray[j + 1];
           }
           (*nrOfAnimals)--;
       }
   }
}

尝试删除同名动物后的结果: 收容所中的动物:1

姓名:泰德

物种:鹦鹉

年龄:1

只有一个被删除,另一个保留。这是什么原因造成的?

【问题讨论】:

标签: arrays c struct c-strings function-definition


【解决方案1】:

对于初学者来说,函数应该至少像这样声明

size_t deleteAnimalByName( ANIMAL *animalArray, size_t nrOfAnimals, const char *animalName );

并且函数可以这样定义

size_t deleteAnimalByName( ANIMAL *animalArray, size_t nrOfAnimals, const char *animalName )
{
    size_t n = 0;

    for ( size_t i = 0; i < nrOfAnimals; i++ )
    {
        if ( strcmp( animalArray[i].Name, animalName ) != 0 )
        {
            if ( n != i ) animalArray[n] = animalArray[i];
            ++n;
        }
    }

    return n;
}

至于您的方法,那么它至少是低效的,因为您在找到需要删除的元素后将数组的所有元素移动到左一个位置。

这是一个演示程序

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

typedef struct ANIMAL
{
    char *Name;
} ANIMAL;

size_t deleteAnimalByName( ANIMAL *animalArray, size_t nrOfAnimals, const char *animalName )
{
    size_t n = 0;

    for ( size_t i = 0; i < nrOfAnimals; i++ )
    {
        if ( strcmp( animalArray[i].Name, animalName ) != 0 )
        {
            if ( n != i ) animalArray[n] = animalArray[i];
            ++n;
        }
    }

    return n;
}

int main(void) 
{
    ANIMAL animalArray[] =
    {
        { "hare" }, { "hare" }, { "fox" }, { "hare" }
    };
    
    size_t nrOfAnimals = sizeof( animalArray ) / sizeof( *animalArray );
    
    nrOfAnimals = deleteAnimalByName( animalArray, nrOfAnimals, "hare" );
    
    for ( size_t i = 0; i < nrOfAnimals; i++ )
    {
        printf( "%s ", animalArray[i].Name );
    }
    putchar( '\n' );

    return 0;
}

程序输出是

fox

【讨论】:

  • @DaboLongwoods 我不知道你运行什么代码。请参阅演示程序。在我的问题中。看看函数是怎么调用的。您似乎错误地调用了该函数。
  • 如果用户使用 scanf 添加动物怎么办?
  • @DaboLongwoods 你什么意思?
  • @DaboLongwoods 演示程序被简化为仅显示如何定义函数。
  • 对于这个程序,我让用户添加一个动物名称,让它用这个代码选择一个物种和一个年龄: int addAnimal(const ANIMAL *AnimalPtr, ANIMAL *animalArray, int *nrOfAnimals) { if (*nrOfAnimals
猜你喜欢
  • 2021-07-23
  • 2019-05-18
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2015-08-04
  • 2019-09-15
  • 2013-06-03
相关资源
最近更新 更多