gpt4 book ai didi

c - 我的 contains 函数有什么问题?

转载 作者:行者123 更新时间:2023-11-30 19:48:51 25 4
gpt4 key购买 nike

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

7年前关闭。




Improve this question




我正在尝试创建一个映射来存储键值对。我写了一个ContainsKey函数 – 如果我找到了 key ,则返回 true否则 false .

我认为我的 EQ 声明有问题,但我不知道问题是什么。有人可以看看我的代码并给我一些指导吗?

这是我的头文件“exer36.h”

#ifndef worksheet36_exer36_h
#define worksheet36_exer36_h

#ifndef DYARRAYDICTH
# define DYARRAYDICTH
/*
dynamic array dictionary interface file
*/
# ifndef KEYTYPE
# define KEYTYPE char *
# endif
# ifndef VALUETYPE
# define VALUETYPE double
# endif


struct association {
KEYTYPE key;
VALUETYPE value;
};


# define TYPE struct association *
# include "exer14.h"
/* dictionary */
int dyArrayDictionaryContainsKey (struct DynArr * da, KEYTYPE key);

# endif

#endif

源文件“exer36.c”
#include <stdio.h>
#include <stdlib.h>
#include "exer36.h"

int dyArrayDictionaryContainsKey (struct DynArr *da, KEYTYPE key){

for (int i=0; i < da->size; i++)
{
if (EQ(((struct association *)da->data[i])->key,key))
return 1;
}

return 0;
}

头文件“exer14.h”
#ifndef worksheet14_exer14_h
#define worksheet14_exer14_h

#ifndef TYPE
#define TYPE int
#endif

# ifndef LT
# define LT(A, B) ((A) < (B))
# endif

#ifndef EQ
#define EQ(a, b) (a == b)
#endif

#endif


struct DynArr {
TYPE *data; /* pointer to the data array */
int size; /* Number of elements in the array */
int capacity; /* capacity ofthe array */
};


/* Dynamic Array Functions */
void initDynArr(struct DynArr *v, int capacity);
void freeDynArr(struct DynArr *v);
int sizeDynArr( struct DynArr *v);
void addDynArr(struct DynArr *v, TYPE val);
TYPE getDynArr(struct DynArr* da, int position);
void putDynArr(struct DynArr* da, int position, TYPE value);
void swapDynArr (struct DynArr* da, int i, int j);
void removeAtDyArr(struct DynArr* da, int index);

主文件
#include <stdio.h>
#include <stdlib.h>
#include "exer36.h"


int main(int argc, const char * argv[])
{

//Create a dynamic array
struct DynArr myArrD;
printf("The size of myArrD should be empty (0), return: %d\n", myArrD.size);

//Add a pair (Key = a AND Value = 1.0)
char * a = "a";
dyArrayDictionaryPut(&myArrD, a, 1.0);
printf("Added one association. Size of myArrD should be 1, return: %d\n", myArrD.size);

printf("%d\n",dyArrayDictionaryContainsKey(&myArrD, a));

return 0;
}

最佳答案

我相信问题在于您的 KEYTYPEchar * ,以及您的 EQ宏只是一个普通的旧 == .当您比较两个 char *== ,您正在测试 指针 相等,如果 则不相等它们指向的值是平等的。您可能想使用 strcmp来自 <string.h>比较键的值。

因为您的 contains 函数正在接受 char * ,并且我假设它仅使用带引号的字符串(例如 dyArrayDictionaryContainsKey(myDynArr, "this is a key") )被调用,它可能总是返回 false,因为您正在比较 指针 .

此外,我认为值得一提的是,尝试通过定义“模板化”您的 map 是......不太理想。我建议将任意数据类型存储为 void * 's,并让调用者将它们转换回它们输入的类型,以及使用函数指针来处理诸如比较等之类的事情。

关于c - 我的 contains 函数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16701990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com