【问题标题】:How to find an element in an array of structs in C?如何在C中的结构数组中查找元素?
【发布时间】:2015-04-09 07:36:34
【问题描述】:

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

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

非常感谢您的帮助。

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

【问题讨论】:

  • 我注意到的第一件事是temp 未初始化,您正在使用它,这将导致未定义的行为
  • 您没有为temp 分配任何内存。使用malloc/calloc 来做到这一点。你所说的“给定的代码应该首先被截断为七个字符”是什么意思?
  • if (pa-&gt;arr[j].code == temp[i])if (pa-&gt;arr[j].code == 0) 相同。使用strcmpstrncmp 比较两个字符串
  • 可以使用strncpy()code的前7个字符复制到temp,不用自己写循环。

标签: c arrays struct


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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(),则完全可以避免此代码

    【讨论】:

      【解决方案3】:

      正如其他人所指出的,您使用的是未初始化的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 */
      }
      

      【讨论】:

      • UB galore 如果找不到产品。
      【解决方案4】:

      当您编写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 和数组之外。

      相反,您要做的是比较 指向 的代码和 包含 的代码:

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

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

      确保您的 temp[] 始终包含 7 个字符,这也是一件好事。

      【讨论】:

        猜你喜欢
        • 2012-03-03
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 2016-08-13
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多