所以我试图完全从头开始制作一个程序(不包括库),并且我有一个非常丑陋的功能:

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;
}

它的丑陋部分源于我需要一种将char actors与int egers('0'-> 0,'1'-> 1,...,'9'-> 9)关联的事实或结构
typedef struct icpair
{
    char cval;
    int ival;
} icpair;

icpair decmap [10] = {{'0',0}, {'1',1}, {'2',2}, {'3',3}, {'4',4}, {'5',5}, {'6',6}, {'7',7}, {'8',8}, {'9',9}};
int decmapLength = sizeof(decmap)/sizeof(icpair);

为了这个目的。但是,如果有一个更好的方法在纯C中进行查找,则查找一个值(即使它存在)也可能会造成难看的行数。我也希望它是可靠的,因此不像ASCII值相减'9'-'ch'。在纯C语言中是否可行?如果可以,如何实现?

最佳答案

C语言中的一个简单 map 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_find(map, '0')来获取整数值,如果未找到,则可以使用返回-1的语义。

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

您可以将API修改为将void *用作键,并将值通用化一下(在缺少泛型的情况下,C缺少此泛型)。将会增加复杂性,例如为哈希表提供哈希函数或为二叉树提供比较函数。

就是说,执行*ch - '0'是安全的,并且会很好地工作。

10-05 21:56