如何在hsearch之前操作字符串

时间:2014-12-27 00:49:49

标签: c

我正在尝试使用<search.h>中的哈希表,但我遇到了一些困难。

在男人中,他们说利用FIND动作进行搜索,使用strcmp确定你搜索的内容是否匹配。

否则

add("foo");
find("foo");

此代码有效:

void add(char *word) {
    ENTRY e, *ep;
    e.key = word;
    e.data = (int *) 1;
    ep = hsearch(e, ENTER);
}

void find(char *word) {
    ENTRY f, *fp;
    f.key = word;
    fp = hsearch(f, FIND);
    if (fp == NULL) {
        printf("This code does not work\n");
    } else {
        printf("This code works\n");
    }
}

这个不是

void add(char *word) {
    ENTRY e, *ep;

    char newWord[100];
    strcpy(newWord, word);

    e.key = newWord;
    e.data = (int *) 1;
    ep = hsearch(e, ENTER);

    if (strcmp(word, newWord) == 0) {
        printf("According to strcmp, those words are equals\n");
    }
}

我必须做strcpy行,因为我需要将word转换为lowercases而且我必须能够添加(“sOmeTHing”)。使用malloc我设法做了我想做的一切,但我很害怕我无法释放任何东西......

你能帮帮我吗? :)

1 个答案:

答案 0 :(得分:0)

您正在存储指向&#34; newWord&#34;的空间的指针。超越其一生。换句话说,&#34; newWord&#34;功能是本地的&#34;添加&#34;这意味着在函数返回时死亡。当发生这种情况时,您存储的地址 - e.key = newWord将变为悬空。

  

使用malloc我设法做了我想做的一切,但我很害怕   什么都不能释放

使用malloc是一种有点理智的方法来处理这个问题:你需要一个比这个功能更长的对象。


真正的解决方案是使用允许您传递自己的比较功能的API。与此问题相比,POSIX指定hsearch和朋友的事实是一个小好处。

Linux手册确实提供了这些&#34;解决方案&#34;释放记忆:

  

如果需要释放这些缓冲区(可能是因为程序是   反复创建和销毁哈希表,而不是创建一个   单个表,其生命周期与程序的生命周期匹配),然后是   程序必须保持允许它的簿记数据结构   释放他们。