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