'Why strcmp does not return 0?

I have a small program to handle a list of rabbits (name, district, participation count) stored in an array of pointers (Rabbit** iterator). I'd like to implement the following methods: add, delete and modify a rabbit, list all the rabbits or list by district.

When I compare for example the name of the rabbits in the list with strcmp() it doesn't return 0 when the names are equal. How can I solve this problem?

The Rabbit struct:

typedef struct Rabbit {
    char* name;
    char* district;
    unsigned part_count;
} Rabbit;

The delete method:

bool delete_rabbit(char* delete_name)
{
    for (unsigned i = 0; i < size; ++i) {
        if (iterator[i] != NULL && strcmp(iterator[i]->name, delete_name) == 0) {
            free(iterator[i]);
            iterator[i] = NULL;
            count--;
            return true;
        }
    }
    return false;
}

The list by district method:

void list_by_district(char* district)
{
    unsigned counter = 0;
    for (unsigned i = 0; i < size; ++i) {
        if (iterator[i] != NULL && strcmp(iterator[i]->district, district) == 0) {
            counter++;
            printf("\n%u. Rabbit:\n", counter);
            printf("Name: %s\nDistrict: %s\nParticipation count: %u\n", iterator[i]->name, iterator[i]->district, iterator[i]->part_count);
        }
    }
}

The modify method is similar to the delete method except it only changes the values.

The corresponding code snippets from main:

Rabbit** iterator;
unsigned size = 10, count = 0;
int main()
{
    iterator = (Rabbit**)malloc(sizeof(Rabbit*) * 10);
    ...
    do {
        ...
        switch (input) {
            case 'a':
                if (count == size) iterator = allocate_more_memory();
                ...
                iterator[count++] = add_rabbit(new_name, new_district, new_part_count);
                break;
            case 'd':
                if (size == count + 6) iterator = allocate_less_memory();
                do {
                    printf("Enter name to be deleted: ");
                    scanf("%[^\n]", delete_name);
                    getchar();
                    if (strlen(delete_name) >= 30) printf("Name only has 30 or less characters!\n");
                } while (strlen(delete_name) >= 30);
                if (!delete_rabbit(delete_name)) printf("\nThere's no rabbit in the list with this name.\n");
                break;
            ...
        }
    } while (input != 'x');  
    ...
    free(iterator);
    return 0;
}

EDIT:

The add method:

Rabbit* add_rabbit(char* new_name, char* new_district, unsigned new_part_count)
{
    Rabbit* new_rabbit = (Rabbit*)malloc(sizeof(Rabbit));
    if (new_rabbit) {
        new_rabbit->name = (char*)malloc((strlen(new_name) + 1) * sizeof(char));
        new_rabbit->district = (char*)malloc((strlen(new_district) + 1) * sizeof(char));
        strcpy(new_rabbit->name, new_name);
        strcpy(new_rabbit->district, district);
        new_rabbit->part_count = new_part_count;
    }
    return new_rabbit;
}

The allocate less memory method:

Rabbit** allocate_less_memory()
{
    Rabbit** new_iterator = (Rabbit**)malloc(sizeof(Rabbit*) * (size - 5));
    if (new_iterator) {
        unsigned counter = 0;
        for (unsigned i = 0; i < size; ++i) {
            if (iterator[i] != NULL) {
                new_iterator[counter++] = iterator[i];
            }
        }
        size -= 5;
        free(iterator);
        return new_iterator;
    }
    return NULL;
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source