Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的contains函数有什么问题?_C_Data Structures_Map_Contains_Containskey - Fatal编程技术网

我的contains函数有什么问题?

我的contains函数有什么问题?,c,data-structures,map,contains,containskey,C,Data Structures,Map,Contains,Containskey,我正在尝试创建一个映射来存储键值对。我编写了一个ContainsKey函数–如果我找到了键,则返回trueelsefalse 我相信我的情商陈述有些不对劲,但我不知道问题出在哪里。有人能看看我的代码并给我一些指导吗 这是我的头文件“exer36.h” 源文件“exer36.c” #包括 #包括 #包括“36.h” int dyArrayDictionaryContainsKey(结构DynArr*da,键类型键){ 对于(int i=0;isize;i++) { if(EQ(((结构关联*)da

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

我相信我的情商陈述有些不对劲,但我不知道问题出在哪里。有人能看看我的代码并给我一些指导吗

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

源文件“exer36.c”

#包括
#包括
#包括“36.h”
int dyArrayDictionaryContainsKey(结构DynArr*da,键类型键){
对于(int i=0;isize;i++)
{
if(EQ(((结构关联*)da->data[i])->key,key))
返回1;
}
返回0;
}
头文件“exer14.h”

\ifndef工作表14\u练习
#定义工作表14
#ifndef型
#定义类型int
#恩迪夫
#ifndef LT
#定义LT(A,B)((A)<(B))
#恩迪夫
#ifndef等式
#定义等式(a,b)(a==b)
#恩迪夫
#恩迪夫
结构动态{
键入*数据;/*指向数据数组的指针*/
int size;/*数组中的元素数*/
int容量;/*阵列的容量*/
};
/*动态数组函数*/
void initDynArr(结构DynArr*v,整数容量);
void freedanarr(struct DynArr*v);
int-sizeDynArr(结构DynArr*v);
void addDynArr(结构DynArr*v,类型val);
类型getDynArr(结构DynArr*da,int位置);
void putDynArr(结构DynArr*da,int位置,类型值);
void swapDynArr(结构DynArr*da,int i,int j);
void removeAtDyArr(结构DynArr*da,int索引);
主文件

#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;
}
#包括
#包括
#包括“36.h”
int main(int argc,const char*argv[]
{
//创建一个动态数组
结构DynArr-myArrD;
printf(“myArrD的大小应为空(0),返回:%d\n”,myArrD.size);
//添加一对(键=a,值=1.0)
char*a=“a”;
dyArrayDictionaryPut(&myArrD,a,1.0);
printf(“添加了一个关联。myArrD的大小应为1,返回:%d\n”,myArrD.Size);
printf(“%d\n”,dyArrayDictionaryContainsKey(&myArrD,a));
返回0;
}

我认为问题在于您的
键类型是一个
字符*
,而您的
EQ
宏只是一个普通的旧
=
。当您将两个
char*
=
进行比较时,您正在测试指针是否相等,而不是它们指向的值是否相等。您可能希望使用
中的
strcmp
来比较键的值

因为您的contains函数正在接受一个
char*
,并且我假设它只被一个带引号的字符串调用(例如,
dyArrayDictionaryContainsKey(myDynArr,“这是一个键”)
),它可能总是返回false,因为您正在比较指针


此外,我认为值得一提的是,试图通过定义“模板化”您的地图是。。。不太理想。我建议将任意数据类型存储为
void*
,让调用者将它们转换回输入的类型,并使用函数指针处理比较等问题。

我的问题已经解决。问题不在我发布的代码中。它来自程序中的另一个现有函数。

使用未初始化的
myArrD
值不是一个好主意。堆栈上的Its==默认情况下,它包含垃圾。此问题似乎与主题无关,因为根据OP下面的“答案”,此内容中没有需要解决的问题。感谢提示。我试过“strcmp”,但没用。你能用
strcmp
发布你的代码吗?我可以向您保证:
strcmp(“我的字符串”、“我的字符串”)==0
,因此,如果不是这样,那么我猜您不是在错误地比较字符串,就是在检查错误的返回值。如果字符串相等,
strcmp
将返回0,这(可能)令人困惑。&CmdrMoozy:Hello。这是我的代码:int-dyArrayDictionaryContainsKey(struct-DynArr*da,KEYTYPE-key){for(int-i=0;isize;i++){if(strcmp(((struct-association*)(da->data[i])->key)==0//返回1;}返回0;}请告诉我缺少什么。非常感谢。既然如此,你为什么不删除这个问题呢?
#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;
}
#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;
}