[英]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.