在简单的C语言中,如何使a的等价物;地图;?

在简单的C语言中,如何使a的等价物;地图;?,c,dictionary,data-structures,C,Dictionary,Data Structures,所以我试图完全从头开始制作一个程序(不包括库),我有一个非常难看的函数: int parseUnsignedInt ( char * ch, unsigned int * ui ) { /* Starting at character ch, reads the unsigned int into the variable ui, returns the number of characters read. */ ui = 0; // unsigned integer in

所以我试图完全从头开始制作一个程序(不包括库),我有一个非常难看的函数:

int parseUnsignedInt ( char * ch, unsigned int * ui )
{
/* Starting at character ch, reads the unsigned int into the
       variable ui, returns the number of characters read.
*/
    ui = 0; // unsigned integer into which the string representation is read 
    int m = 1; // multiplier
    int ncp = 0; // # of characters parsed
    while (*ch)
    {
        bool chid = false; // ch is a decimal
        for (int k = 0; k < decmapLength; ++k)
        {
            if (decmap[k].cval == *ch)
            {
                ui += decmap[k].ival * m;
                m *= 10;
                chid = true;
                break;
            }
        }
        if (!chid) break;
        ++ncp;
        ++ch;
    }
    return ncp;
}

为此目的。但是,查找一个值(如果它确实存在的话)会导致大量的行无法压缩,如果有更好的方法在纯C中实现这一点的话。我也希望这是可靠的,因此没有像
'9'-'ch'
那样的ASCII值减法。这在纯C中可能吗?如果可能,它是如何实现的?

C中的简单映射API可能如下所示:

Map * map_create(void);
void map_insert(Map * map, char key, int value);
int map_find(Map * map, char key);
void map_destroy(Map * map);
然后您可以执行
map\u find(map,'0')
来获取整数值,如果找不到,可能会使用返回
-1
的语义

根据您的需要,可以使用许多不同的数据结构来实现这一点。如果您不关心维护订单,则哈希表可能是最合适的。例如,如果您确实需要维护基于键的顺序,二叉树可能是更好的主意(可能是红黑树)

您可以修改API,使其对键和值采用
void*
,以对其进行一点泛化(在没有泛型的情况下,C缺少泛型)。这会增加复杂性,比如为哈希表提供哈希函数或为二叉树提供比较函数

这就是说,执行
*ch-'0'
是安全的,而且可以很好地工作。

如果您想将任意10个随机字符映射到
0..9
,您不需要单独的结构元素
ival
-“自然顺序”已经立即索引了正确的数字。因此,您可以使用一个长度为10个随机字符的
char
数组作为查找

如果此数组中的字符连续递增1,则根本不需要该数组。在这种情况下,您可以减去第一个代码,测试结果是否在0和9之间,表示成功,否则拒绝字符

这适用于C中的数字集,因为C的规范要求:

在源字符集和执行基本字符集中,上述列表中
0
之后的每个字符的值应比前一个字符的值大一个。(5.2.1字符集in )

因此,要获得任何数字的数值,
字符-“0”
始终为真


作为旁注,这不是为范围
a..Z
a..Z
定义的。这意味着,如果将
'A'
视为
0
,则不能保证
'J'-'A'==9
。为此,您需要再次使用简单的查找字符数组。

ui=0
替换为
*ui=0
ui+=decmap[k].ival*m
替换为
*ui+=decmap[k].ival*m
。否则什么也不返回为什么没有ASCII减法
*ch-'0'
正是您所要寻找的。@JuanLopes在编译此程序的所有可能系统上都能工作吗?C规范保证
ch-'0'
工作,无论使用哪个字符集,只要
ch
保存0到9之间的数字。在内部循环中,它可以是:
*ui*=10
后跟
*ui+=decmap[k].ival,否则“1000”将计算为1。我认为
m
没有用。
Map * map_create(void);
void map_insert(Map * map, char key, int value);
int map_find(Map * map, char key);
void map_destroy(Map * map);