我太难了。我正在学习 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/