繁体   English   中英

如何在C中找到结构数组中的元素?

[英]How to find an element in an array of structs in C?

我必须编写一个函数来查找具有给定数组的给定代码的产品。 如果找到product,则返回指向相应数组元素的指针。

我的主要问题是给定的代码应首先截断为7个字符,然后才与数组元素进行比较。

非常感谢你的帮助。

struct product *find_product(struct product_array *pa, const char *code) 

{   
char *temp;
int i = 0;
    while (*code) {
        temp[i] = (*code);
        code++;
        i++;
        if (i == 7)
            break;
    }
    temp[i] = '\0';

for (int j = 0; j < pa->count; j++)
    if (pa->arr[j].code == temp[i])
        return &(pa->arr[j]);
}

你为什么不在循环中使用strncmp?

struct product *find_product(struct product_array *pa, const char *code) 
{ 
   for (size_t i = 0; i < pa->count; ++i)
   {
      if (strncmp(pa->arr[i].code, code, 7) == 0)
          return &pa->arr[i];
   }
   return 0;
}

temp是一个未初始化的指针,你正在取消引用它,这将导致未定义的行为。

temp = malloc(size); // Allocate some memory size = 8 in your case

我看到的另一个错误是

if (pa->arr[j].code == temp[i]) // i is already indexing `\0` 

应该

strcmp(pa->arr[j].code,temp); // returns 0 if both the strings are same

如果你可以使用strncmp()完全可以避免这个代码

正如其他人所指出的,你正在使用temp未初始化,并且你总是将字符与'\\0'进行比较。

您不需要temp变量:

int strncmp(const char * str1,const char * str2,size_t num);

比较两个字符串的字符

将C字符串str1的最多num个字符与C字符串str2的字符进行比较。

/* Don't use magic numbers like 7 in the body of function */
#define PRODUCT_CODE_LEN 7

struct product *find_product(struct product_array *pa, const char *code) 
{   
    for (int i = 0; i < pa->count; i++) {
        if (strncmp(pa->arr[i].code, code, PRODUCT_CODE_LEN) == 0)
            return &(pa->arr[i]);
    }
    return NULL; /* Not found */
}

当你写char* temp; 你刚刚宣布一个未初始化的指针

在您的情况下,因为您说代码被截断为7,您可以在堆栈上创建一个缓冲区,其中包含代码的位置

char temp[8];

写作

temp[i] = (*code);
code++;
i++;

可以简化为:

temp[i++] = *code++;

在你的循环中

for (int j = 0; j < pa->count; j++)
    if (pa->arr[j].code == temp[i])
        return &(pa->arr[j]);

您正在比较code的地址和temp[i]的字符值,它偶然可能是8并且在数组之外。

相反,你想要做的是比较什么代码和temp 包含什么:

for (int j = 0; j < pa->count; j++)
    if (!strncmp(pa->arr[j].code, temp, 7)
        return &(pa->arr[j]);

你还应该return NULL; 如果什么都没找到,似乎你什么也没有回来。

可能一件好事也是为了确保你的temp []总是包含7个字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM