在简单的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);