c语言字典库的使用,实现键值对查找,以字符串为Key,以指针为Value

用C语言字典实现词典功能 C语言字典词典 用C语言字典实现词典功能 C语言字典词典增加、删除、修改、显示单词,可以作为链表课设。 阅读详情
AI摘要

本文介绍了一个C语言实现的字典库,该库使用字符串作为键,支持任意类型的指针作为值,适用于函数指针查找及结构体指针存储。文章详细描述了字典库的源码、接口说明及使用测试。

c语言字典库的使用,实现键值对查找,以字符串为Key,以指针为Value

dictionary库的使用

前不久,一直在找一个c语言版的hash键值对库,找到一个dictionary库,是以字符串为key,以字符串为value的键值对库,但是我需要的是以字符串为key,以任意指针为value的键值对库,这样我就可以用函数名,去查找函数指针,并调用函数;也可以用对象名,去找结构体指针。所以我这里对原版的dictionary库做了一点小修改,以满足我的需求

dictionary库源码

dictionary.c文件内容

/*-------------------------------------------------------------------------*/
/**
   @file    dictionary.c
   @author  N. Devillard
   @brief   Implements a dictionary for string variables.

   This module implements a simple dictionary object, i.e. a list
   of string/string associations. This object is useful to store e.g.
   informations retrieved from a configuration file (ini files).
*/
/*--------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------
                                Includes
 ---------------------------------------------------------------------------*/
#include "dictionary.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/** Maximum value size for integers and doubles. */
#define MAXVALSZ    1024

/** Minimal allocated number of entries in a dictionary */
#define DICTMINSZ   128

/** Invalid key token */
#define DICT_INVALID_KEY    ((char*)-1)

/*---------------------------------------------------------------------------
                            Private functions
 ---------------------------------------------------------------------------*/

/* Doubles the allocated size associated to a pointer */
/* 'size' is the current allocated size. */
static void * mem_double(void * ptr, int size)
{
   
   
    void * newptr ;
 
    newptr = calloc(2*size, 1);
    if (newptr==NULL) {
   
   
        return NULL ;
    }
    memcpy(newptr, ptr, size);
    free(ptr);
    return newptr ;
}

/*-------------------------------------------------------------------------*/
/**
  @brief    Duplicate a string
  @param    s String to duplicate
  @return   Pointer to a newly allocated string, to be freed with free()

  This is a replacement for strdup(). This implementation is provided
  for systems that do not have it.
 */
/*--------------------------------------------------------------------------*/
static char * xstrdup(const char * s)
{
   
   
    char * t ;
    if (!s)
        return NULL ;
    t = (char*)malloc(strlen(s)+1) ;
    if (t) {
   
   
        strcpy(t,s);
    }
    return t ;
}

/*---------------------------------------------------------------------------
                            Function codes
 ---------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/
/**
  @brief    Compute the hash key for a string.
  @param    key     Character string to use for key.
  @return   1 unsigned int on at least 32 bits.

  This hash function has been taken from an Article in Dr Dobbs Journal.
  This is normally a collision-free function, distributing keys evenly.
  The key is stored anyway in the struct so that collision can be avoided
  by comparing the key itself in last resort.
 */
/*--------------------------------------------------------------------------*/
unsigned dictionary_hash(const char * key)
{
   
   
    int         len ;
    unsigned    hash ;
    int         i ;

    len = strlen(key);
    for (hash=0, i=0 ; i<len ; i++) {
   
   
        hash += (unsigned)key[i] ;
        hash += (hash<<10);
        hash ^= (hash>>6) ;
    }
    hash += (hash <<3);
    hash ^= (hash >>11);
    hash += (hash <<15);
    return hash ;
}

/*-------------------------------------------------------------------------*/
/**
  @brief    Create a new dictionary object.
  @param    size    Optional initial size of the dictionary.
  @return   1 newly allocated dictionary objet.

  This function allocates a new dictionary object of given size and returns
  it. If you do not know in advance (roughly) the number of entries in the
  dictionary, give size=0.
 */
/*--------------------------------------------------------------------------*/
dictionary * dictionary_new(int size)
{
   
   
    dictionary  *   d ;

    /* If no size was specified, allocate space for DICTMINSZ */
    if (size<DICTMINSZ) size=DICTMINSZ ;

    if (!(d = (dictionary *)calloc(1, sizeof
C# Dictionary使用详解 在 C# 中,是一个非常常用的数据结构,用于存储键值对。Dictionary类实现了接口,并且提供了许多有用的方法和属性来操作键值对集合。下面是一些关于如何使用Dictionary。 阅读详情

相关推荐

C语言实现通用的字典算法

在C语言中,我们可以使用结构体和指针来实现一个简单而通用的字典算法。在本文中,我将介绍如何使用C语言编写一个基本的字典,并提供相应的源代码。通过上述代码,我们实现了一个简单而通用的字典算法,并提供了基本的字典操作函数。接下来,我们可以实现一些基本的字典操作函数,例如初始化字典、插入键值对、查找值等。函数用于查找指定键对应的值,它会遍历字典中的键值对,如果找到了对应的键,则返回相应的值;函数用于插入一个键值对到字典中,如果字典未满,则将键和值分别存储到。函数用于初始化字典,将字典的大小设为 0。

2301_79331421的博客 1271

2025年一篇解决Windows11安装医学图像处理工具-FSL(各种问题解决,过程详细,小白轻松安装)

2025年一篇帮你解决FSl安装所有问题,包括环境安装、使用说明、常见问题,过程简单易懂,小白轻松安装。

weixin_52145255的博客 2524

从FPGA工程师视角看CXP-12:如何用Xilinx GTX/GTH收发器搞定一条50Gbps的工业相机数据流?

本文从FPGA工程师视角详细解析了如何利用Xilinx GTX/GTH收发器实现50Gbps的CXP-12工业相机数据流传输。通过协议分析、硬件设计要点和FPGA逻辑实现,帮助开发者高效构建高带宽工业视觉系统,特别适合4K/8K高分辨率图像处理需求。

weixin_42533622的博客 282

HID报告描述符实战解析:从Usage到Item的完整设计流程

本文深入解析了HID报告描述符的设计流程,从核心概念Usage(用途定义)入手,详细阐述了如何通过Item(条目)的三种角色——全局、局部与主干,构建出能被系统正确识别的设备“说明书”。文章以标准USB鼠标和键盘为例进行实战拆解,并介绍了使用Report ID与自定义设备等进阶设计方法,帮助开发者掌握这一实现USB设备即插即用的关键技术。

weixin_29230865的博客 282

Vivado+VCS+Verdi三件套实战:如何高效仿真AXI VIP并快速查看波形

本文详细介绍了如何利用Vivado+VCS+Verdi工具链高效仿真AXI VIP并快速查看波形。通过环境配置、Vivado工程准备、VCS编译与仿真优化以及Verdi波形分析技巧,实现仿真速度的数量级提升,显著提高FPGA开发效率。

red88的博客 1001

一文读懂YOLO V5 与 YOLO V4

一文读懂YOLO V5 与 YOLO V4 YOLO之父Joseph Redmon在今年年初宣布退出计算机视觉的研究的时候,很多人都以为目标检测神器YOLO系列就此终结。然而在4月23日,继任者YOLO V4却悄无声息地来了。Alexey Bochkovskiy发表了一篇名为YOLOV4: Optimal Speed and Accuracy of Object Detection的文章。YOLO V4是YOLO系列一个重大的更新,其在COCO数据集上的平均精度(AP)和帧率精度(FPS)分别提高了10%

williamhyin的博客 8796

Modem2G/3G/4G/5G:RFFE Driver(射频前端驱动):高通平台GRFC配置方法

文 | GentlemanTsao 文章目录前言1.什么是GRFC2.GRFC的配置流程概览3.msm_sig_info的配置与分析msm_sig_info Table位置:msm_sig_info Table示例:Table元素解读:rfc_msm_sig_info_type结构体signal typemsm_gpio |grfc_num:GPIO到GRFC的映射output_typefunction_select4._sig_cfg的配置与分析_sig_cfg table位置:_sig_cfg tabl

GentelmanTsao的博客 7315

通过采用下面方法检查内容,还是系统无法更新下载,但是错误代码变成了——下载错误 - 0x80004002-到底如何解决?必须重装系统吗?-这个到底是系统问题,还是硬件问题?

‌。

qq_15963745的博客 337

mongodb在游戏开发领域的优势

目前游戏服务器使用mysql作为数据库的较多,然而,使用mongodb来作为存储层,在某些方面比mysql更为方便和适合。

littleschemer的博客 1700

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: linux c 线程池库
下一篇: 字符串转浮点数atof函数的实现
elimuzi
博客等级 码龄10年 56粉丝 113原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值