【问题标题】:Key-Value pair in C?C中的键值对?
【发布时间】:2018-07-03 17:07:12
【问题描述】:

我有一个格式为

的字符串
"SERVERID=12345\nSERVERKEY=asdasw\nSERVERAPPID=123213\n"

我已经使用strtok() 逐行解析了这一行。 有没有办法为每一行制作一个键值对?就像也许将它们存储在某种数组中?我的意思是,如果我想要SERVERID,我只说Array['SERVERID'],它会返回12345 作为值。有没有办法在C中做到这一点?

【问题讨论】:

  • 没有。欢迎来到 C.
  • 有(非标准)方法可以或多或少地获得结果,但不使用您建议的符号。字符串应该用双引号括起来,您需要使用函数调用来进行查找,并且您将在幕后使用结构,并且您将拥有其他函数来创建键值对数组,并添加键值对,并删除它们,等等。它会一直使用函数来完成。
  • find(dict, "SERVERID") 会做吗?
  • 你需要用 C 编写你自己的数据结构。如果你可以用 C++ 编写它,我会使用它并使用内置的地图
  • @JonathanLeffler 有这种实现的示例代码吗?

标签: c parsing key-value keyvaluepair


【解决方案1】:

标准 C 没有像您正在寻找的那样为您提供任何“容器类型”。您仍然有多种选择来解决您的问题:

  1. 可能听起来很傻,但您可以切换到其他语言。这至少是值得考虑的事情。例如,我想到了 C++,它提供了 std::map 类型。

  2. 使用一些第三方库。一个流行的选择是GLib,它提供了一个您可以使用的hash table

  3. 您始终可以选择自行实施。一个非常简单的想法是使用结构数组,例如

    struct stringpair {
        char *key;
        char *value;
    };
    
    struct stringpair *table;
    
    // ...
    size_t entries = 42; // number of entries you found
    table = malloc(entries * sizeof *table); // check for NULL after this
    
    // look for an entry:
    char *value = 0;
    for (size_t i = 0; i < entries; ++i)
    {
        if (!strcmp(table[i].key, "SERVERID"))
        {
            value = table[i].value;
            break;
        }
    }
    

    这当然是一个非常基本的解决方案,在很多条目时表现不佳。我也没有测试这段代码,只是给你一个粗略的想法。如果您需要快速查找,则需要实现哈希表,或使用选项 1 或 2。

【讨论】:

    【解决方案2】:

    您在这里寻找的是一种字典形式。通常,但并非总是如此,这些使用哈希表。在 C 中创建哈希表的方法有很多种

    您可以在这里找到答案: What is a hash table and how do you make it in C?

    您还可以看到其他实现,例如组合数据结构、字典链表等。只需找到一种方法将您的字符串 (char *) 转换为数字,然后找到一种方法将该数字用作索引。

    【讨论】:

    • 这看起来更像是评论而不是答案。
    • 我还没有评论权限,但无论如何我都想回答这个问题。你建议我删除它吗?如果是这样,我能否进一步解释一下,以免以后再犯同样的错误?
    • 我想说这不是一个好的答案,但链接和简短的解释可能会有所帮助,所以,它也不是一个 -> 保留它。跨度>
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多