2014-06-05 23 views
-1

如何在C中创建以下类型的字典?C中的结构和字典

back={{(0,2,"ADJ"):("NP+V","ADJ",0)},{(0,2,"U"):("NP",".",1)}} 

我已经创建了一个结构如下:

struct bp 
{ 
    char s[20]; 

    char s1[20]; 

    int i; 

}; 

struct bp arr[3][3][3]; 

struct val; 

val.s="NP+D"; 

val.s1="ADJ"; 

val.i=0; 

arr[0][2]["ADJ"]=val; 

但这种方法不正确,因为在ARR数组下标不能是字符串。

有人可以给这个问题的解决方案吗?

+0

'c'中的字典? O.o –

+1

C没有内置字典类型。你必须使用第三方库。 – dandan78

回答

0

用整数对数组索引是一种简单的数学乘法/加法,它通常对应于一个或两个汇编指令。请记住,这是C擅长的:非常低级的,低开销的代码。通过像字符串这样的其他“对象”来访问集合并不是计算机本身“知道如何去做”的东西。它由语言/运行时/标准库实现。

在语言及其标准库(如Java,C#,Python等)中找到的“字典”通常以hashtable的形式实现。 C没有“标准”实现。你将不得不使用一些其他库,或者如果你想要一个很好的挑战,请自己写。

0

在C实现Pythonesque为 '字典':

back={{(0,2,"ADJ"):("NP+V","ADJ",0)},{(0,2,"U"):("NP",".",1)}} 

你会需要以下两种结构类型(一个用于左手键,一个对于右边的值),或者你将使用字符串的一切。

使用你的代码作为一个松散的基础上,你可能有:

struct ap 
{ 
    int i1; 
    int i2; 
    char s1[20]; 
}; 

struct bp 
{ 
    char s1[20]; 
    char s2[20]; 
    int i1; 
}; 

,也许:

struct Dictionary 
{ 
    struct ap key; 
    struct bp value; 
}; 

然后,您可以使用一个初始化:

struct Dictionary oed[] = 
{ 
    { { 0, 2, "ADJ" }, { "NP+V", "ADJ", 0 } }, 
    { { 0, 2, "U" }, { "NP", ".", 1 } }, 
}; 

如果您需要要创建并填充结构,可以使用C99复合文字:

struct Dictionary chambers = (struct Dictionary){ { 0, 2, "ADJ" }, { "NP+V", "ADJ", 0 } }; 

还是做任务零碎:

struct Dictionary merriam; 

merriam.key = (struct ap){ 0, 2, "ADJ" }; 
merriam.value = (struct bp){ "NP+V", "ADJ", 0 }; 

或做任务的成员在同一时间:

struct Dictionary webster; 

webster.key.i1 = 0; 
webster.key.i2 = 2 
strcpy(webster.key.s1, "ADJ"); 
strcpy(webster.value.s1, "NP+V"); 
strcpy(webster.value.s2, "ADJ"); 
webster.value.i1 = 0; 

注意,这个轮廓简单地存储数据的交易。它不涉及对关键值或其他花哨的(必要的)内存管理进行散列处理。该代码假定字符串将适合;它应该检查字符串是否符合

但是,没有用于管理这种结构的标准C库;你要么写自己的,要么借别人的图书馆。