c - 如何比较和注册复制的数组值

标签 c

我无法解释此练习的逻辑...

练习要求我在一个结构中注册 5 个“品牌” 并且输出必须显示每个品牌重复了多少次(当然,如果它已注册多次)。

#include <stdio.h>
#include <stdlib.h>

#define C 5

typedef struct      
{
    int id;
    char brands[30];
} Something;


Something a[C];
int main() 
{
    int i=0, j=0;

    //input
    for(i=0;i<C;i++)
    {
        a[i].id = i;

        printf("BRAND: ");
        fflush(stdin);
        gets(a[i].brands);
    }

    for(i=0;i<C;i++)
    {
        for(j=0;j<C;j++)
        {
            if (strcmp(a[i].brands, a[j].brands)==0)
                // 
        }
    }
    return 0;
}

品牌输入值不是恒定的,它可以是任何东西。

所以我想通过搜索来比较是否有相同的品牌并为每个品牌增加一个计数器。 (这个计数器是我卡住的地方,因为我不知道注册表中会有多少个不同的品牌)...

例如1
输入

Ford
Ferrari
Ford
Nissan
Nissan

输出应该是这样的:

Ford 2x
Ferrari 1x
Nissan 2x


例如2
输入

Ford
Ford
Ford
Ford
Nissan

输出:

Ford 4x
Nissan 1x

最佳答案

有很多方法可以实现您想要的目标。以下是一些建议,希望能帮助您找到解决方案。

第一步是在您的结构中包含一个计数器。

typedef struct      
{
    int id;
    char brands[30];
    unsigned int count;
} Something;

将所有 count 字段初始化为 0。如果 count 大于 0,则 brands 字段仅包含有效字符串。由于 a 是一个全局变量,所有字段都会自动初始化为 0,因此不需要额外的代码。

然后,每次读取输入时,代码都会从头开始搜索 a。搜索逻辑是

for each 'a' entry
    if (count field > 0)
        if (brand field is same as input)
            // Found a match
            increment count field
            break out of loop
        // else will check next entry by continuing the loop
    else
        // Reached end of valid entries. Hence no match.
        Create a new entry. Copy input into the brand field. 
        Set count field to 1.
        break out of loop

我特意展示了伪代码,以便将 C 代码留给您作为练习。但基本上的想法是(如我之前的评论中所述)在读取每个输入后搜索现有的有效条目(您不需要两个单独的数组)。

关于c - 如何比较和注册复制的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35665768/

相关文章:

c - 在 C 中调用 abort() 时如何指定消息?

c - 调用内核次数过多时程序停止工作

c - 如何找到下一个种子,使随机数序列在 C 中保持不变?

c - fputs 数组内部 for (C)

c - 调用 clock() 时出现段错误

c++ - 在 C/C++ 中读取/写入 screen 进程

c - C 中 printf() 中的大字段宽度

c - OpenSSL 1.0.2 和错误 "SSL_CTX_new:library has no ciphers"

创建一个函数; scanf 和 char 问题

c - 如何从exec返回控制权?