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

时间:2015-04-09 07:36:34

标签: c arrays struct

我必须编写一个函数来查找具有给定数组的给定代码的产品。如果找到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]);
}

4 个答案:

答案 0 :(得分:10)

为什么不在循环中使用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;
}

答案 1 :(得分:4)

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()

,则可以完全避免使用此代码

答案 2 :(得分:2)

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

您不需要temp变量:

  

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

     

比较两个字符串的字符

     

比较最多的num个字符   C字符串str1为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 */
}

答案 3 :(得分:1)

当您编写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的地址和偶然可能为8且位于数组之外的temp[i]的字符值。

相反,你要做的是比较指向的代码和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个字符也是一件好事。