为什么strCMP不返回0?

发布于 2025-01-19 19:37:57 字数 3284 浏览 1 评论 0原文

我有一个小程序来处理存储在一系列指针(Rabbit ** Iterator)中的兔子(名称,地区,参与数)的列表。我想实现以下方法:添加,删除和修改兔子,按地区列出所有兔子或清单。

例如,当我将列表中兔子的名称与strcmp()比较时,当名称相等时,它不会返回0。我该如何解决这个问题?

兔结构:

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

删除方法:

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

按区方法列表:

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

修改方法类似于删除方法,但仅更改值。

来自主的相应代码片段:

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

编辑:

添加方法:

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

分配少存储方法:

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文