c - 在 C 中,如何使用字符串数组作为查找表?

标签 c hashtable

我太难了。我正在学习 C 并有这个问题:

如何使用字符串数组作为查找表?

我有一个“键”列表:

"A", "A#", "B", "Bb", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"

并且每个都将引用一个特定的 int“值”(不是唯一的)。 例如“A”-> 9“A#”-> 10“Bb”-> 10

我找到了一个答案 ( store known key/value pairs in c ),当它说“我会......建议只使用一个字符串数组作为查找表”时,我认为它为我指明了正确的方向

但我不知道如何将字符串数组实际实现为查找表?

最佳答案

由于您打算将字符串用作具有整数值的键,因此最好使用 struct 来包含这样的一对。然后建立一个表。最后,由于您一直小心地保持键的排序顺序,您可以使用 C 库函数 bsearch 进行查找:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct pair {
  char *key;
  int value;
} PAIR;

// Key strings must be in strcmp() sorted order!
PAIR table[] = {
  {"A",  9}, {"A#", 10}, {"B",  11}, {"Bb", 10}, {"C", 11}, {"C#", 12}, {"D", 13},
  {"D#", 14}, {"E", 15}, {"F", 16}, {"F#", 17}, {"G", 18}, {"G#", 19},
};

static int compare_keys(const void *va, const void *vb) {
  const PAIR *a = va, *b = vb;
  return strcmp(a->key, b->key);
}

int get_value(char *key) {
  PAIR key_pair[1] = {{key}};
  PAIR *pair = bsearch(key_pair, table,
      sizeof table / sizeof table[0], sizeof table[0], compare_keys);
  return pair ? pair->value : -1;
}

int main(void) {
  // Partial test: verify we can look up all the valid keys.
  for (int i = 0; i < sizeof table / sizeof table[0]; ++i) {
    int value = get_value(table[i].key);
    printf("%s -> %d\n", table[i].key, value);
  }
  return 0;
}

关于c - 在 C 中,如何使用字符串数组作为查找表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215355/

相关文章:

java - 为什么Hashmap不同步,Hashmap内部实现了Hashtable(是同步的)。

arrays - Powershell读取/更新/写入参数文件

c - 终端无法识别更改,除非我写 "make programm"

c - C 编程中的段错误...通过或失败程序最后是通过和失败学生的列表

c - C 中的类型检查宏参数

hashtable - dynamodb 表中的哈希范围有什么用?

c# - 如何使用 C#.NET HashTable 实现所需的 JSON 格式

c - 设置共享变量时应该使用临界区还是内存屏障?

c++ - 在 cmake 中启用 Qspectre 和 Control Flow Guard 开关

c - 在已插入订单元素中打印哈希表