使用strcmp时出错

momolvp 2009-12-08 06:19:43
哈希表源文件

int hash(char *key) //hash索引值算法
{
int n = 0;
char *ch = key;
while (*ch)
{
n <<= 1;
n += (*ch);
++ch;
}
return(n % HTMAXSIZE);
}

HTtable *HTcreate() //创建hash table
{
........
}

int HTinsert(HTtable *ht, char* key, HTelem elem) //数据插入hash table,成功返回1,失败返回0
{
.......
}

HTelem HTfind(HTtable *ht, char* key) //根据关键字查找用户数据,找到返回用户数据指针,否则返回空
{
int i = hash(key);
struct HTentry *entry;
if ((i < 0) || (i >= HTMAXSIZE)) return(NOTFOUND);
entry = ht[i];
while (entry != NULL)
{
if (strcmp(entry->elem->key, key) == 0) return(entry->elem);
entry = entry->next;
}
return(NOTFOUND);
}

void HTfree(HTtable *ht) //清空hash table
{
........
}



主源文件

HTtable* pt;
char *key;

//插入部分
struct HTdata data[] = {
{"100", "VK_UP", "1","1"}, //第一项为主键,代表时间
{"120", "VK_RIGHT","1", "2"},
{"150", "VK_LEFT","1", "3"},
{"170", "VK_LEFT","1", "3"},
{"200", "VK_LEFT","1", "3"}

};
pt = HTcreate();

for(int i=0;i <5; i++)
{
HTinsert(pt, data[i].key, &data[i]);
}



//查找部分
char g[6];
int s;

s = (int)((tNow - tstart)/100);
itoa(s,g,10);
HTelem hs = HTfind(pt, g);

HTfree(pt);


通过(tNow - tstart)/100获取时间,然后与插入的表中的主键进行对比,相同则返回查找到该项的内容。
程序编译通过,但运行后会出错,0x1026f7e0(msvcr90d.dll) 处最可能的异常: 0xC0000005: 读取位置 0x00000200 时发生访问冲突,并弹出文件strcmp.asm(只读的文件),下一条将要运行的语句指在 mov eax,[edx] 处
这个是什么出问题了?是strcmp处的entry->elem->key和key比较时不同产生的吗?
...全文
1082 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
beginnow 2009-12-09
  • 打赏
  • 举报
回复
有两个地方可能会出问题
int HTinsert(HTtable *ht, char* key, HTelem elem)
->第二个参数是外部传入的,如果是调用这个函数的函数使用的是局部变量则函数退出的时候再在别的地方使用必定会出问题,所以建议你不要用指针指向这个传入的字符串,而是分配内存拷贝过来,

//查找部分
char g[6];->这个存在越界的可能
int s;
momolvp 2009-12-09
  • 打赏
  • 举报
回复
entry->elem->key确实没有值 为什么呢 insert时应该插入了的啊
shichuan609 2009-12-09
  • 打赏
  • 举报
回复
这个最近好像也遇到过,strcmp(entry->elem->key, key),可能第一个指针是空的,可以打印entry->elem->key的值看看。
ypb362148418 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hqin6 的回复:]
if (strcmp(entry->elem->key, key) == 0) return(entry->elem);
在这句话调试到的时候,打印一下key和entry->elem->key的内容
[/Quote]

试试这种办法
momolvp 2009-12-08
  • 打赏
  • 举报
回复
#include<stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>


hash.h

#ifndef __HASH_H
#define __HASH_H

#define HTMAXSIZE 1999
#define NOTFOUND 0
#define MAXLEN 127
#ifdef __cplusplus
extern "C" {
#endif


struct HTdata //时间和按键
{
char *key; //时间,取0.1s为单位大小,将(gettickcount-tstart)/100,在进行强制转换
char *tDown; //按键
char *num1;
char *num2;

};

typedef struct HTdata *HTelem;

struct HTentry //hash table 结构
{
HTelem elem;
struct HTentry *next;
};


typedef struct HTentry *HTtable;

HTtable *HTcreate(void); //创建hash table
int HTinsert(HTtable *, char *, HTelem ); //根据用户提供的关键字和数据插入表格中
HTelem HTfind(HTtable *, char * ); //根据关键字,查找数据
void HTfree(HTtable *); //释放hash table


#ifdef __cplusplus
}
#endif

#endif



hash.cpp

#include "stdafx.h"
#include <malloc.h>
#include <string.h>
#include "Hash.h"

int hash(char *key) //hash索引值算法
{
int n = 0;
char *ch = key;
while (*ch)
{
n <<= 1;
n += (*ch);
++ch;
}
return(n % HTMAXSIZE);
}


HTtable *HTcreate() //创建hash table
{
int i;
HTtable *ht =
(HTtable *) calloc(HTMAXSIZE, sizeof(HTtable));
if (ht != NULL)
for (i=0; i<HTMAXSIZE; i++) ht[i] = NULL;
return(ht);
}

int HTinsert(HTtable *ht, char* key, HTelem elem) //数据插入hash table,成功返回1,失败返回0
{
int i = hash(key);
struct HTentry *entry;
if ((i < 0) || (i >= HTMAXSIZE) || (0==elem) ) return(0);
entry = (struct HTentry *) malloc(sizeof(struct HTentry));
if (entry == NULL) return(0);
elem->key = key;
entry->elem = elem;
entry->next = ht[i];
ht[i] = entry;
return(1);
}

HTelem HTfind(HTtable *ht, char* key) //根据关键字查找用户数据,找到返回用户数据指针,否则返回空
{
int i = hash(key);
struct HTentry *entry;
if ((i < 0) || (i >= HTMAXSIZE)) return(NOTFOUND);
entry = ht[i];
while (entry != NULL)
{
//cout<<entry->elem->key<<" "<<key<<endl;
if (strcmp(entry->elem->key, key) == 0) return(entry->elem);
entry = entry->next;
}
return(NOTFOUND);
}

void HTfree(HTtable *ht) //清空hash table
{
struct HTentry *entry,
*nextentry;
int i;
for (i=0; i<HTMAXSIZE; i++)
{
entry = ht[i];
while (entry != NULL)
{
nextentry = entry->next;
free(entry);
entry = nextentry;
}
}
free(ht);
}

sj13426074890 2009-12-08
  • 打赏
  • 举报
回复
最好把数据结构 和Insert方法贴出来
momolvp 2009-12-08
  • 打赏
  • 举报
回复
在那中断查到的值key是"100",entry->elem->key是"?" 然后我将插入表的第一个key改成"90",查找的值又变成58了...插入的是const char[]啊。为什么会这样
太乙 2009-12-08
  • 打赏
  • 举报
回复
if (strcmp(entry->elem->key, key) == 0) return(entry->elem);
在这句话调试到的时候,打印一下key和entry->elem->key的内容

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧