我会建议一个稍微简单一点的解决方案,尽管可能效率不高。
这是我在咨询我的一位教授后为一个项目提出的解决方案。
字符串本质上只是ASCII字符,包含变量名的C文件也可以这样理解。
因此,假设您有一个字符串列表,您希望将其转换为整数的变量名。
首先,在一个头文件中定义您的结构,该头文件可以被您目录中的所有文件访问,例如“struct.h”。
第一步是将字符串名称转换为各自的整数
只需创建一个名为 variable_names.h 的空标头,包含 struct.h,然后一劳永逸地在主文件中调用以下循环:
const char *strings[] = {"str1", "str2", ... }
fp = fopen("variable_names.h", "a");
fprintf(fp, "#ifndef FILE1_H \n");
fprintf(fp, "#define FILE1_H \n");
fprintf(fp, "extern int* m_integers = {");
int i;
for(i = 0; i < sizeof(strings) - 1; i++){ fprintf(fp, "m.%s,", strings[i]);}
fprintf(fp, "m.%s } ", strings[i+1])
fprintf(fp, "#endif");
现在您通过 m_integers 数组在结构中的字符串名称和值之间建立了线性映射。接下来是创建一些接受字符串名称并将其指向该整数的映射。我会使用 UTHASH,但肯定还有其他方法。
因此,在您的主文件中,
#include "uthash.h"
#include "variable_names.h"
...
struct opcode_table{
char* opcode_key;
int opcodes_val;
UT_hash_handle hh;
};
struct opcode_table *mapping = NULL;
struct opcode_table* s = NULL;
for (int i = 0; i < opcode_size; i++){
s = (struct opcode_table*) malloc(sizeof(*s));
s->opcodes_key = strings[i]; // the string
s->opcode_val = m_integers[i]; // the integer
HASH_ADD(hh,mapping, opcodes_key, sizeof(int),s);
}
^ 请在代码上放轻松,这只是一个可以做的粗略示例。我确信有一些错误,但我相信这应该有效。
作为概述,这个想法本质上是,您将 ascii 字符“m.string1”写入外部文件,一旦写入,就会通过结构定义解释为整数,从而产生您想要的结果。现在,您必须简单地在哈希表中查找字符串,然后在结构中得到整数。
另外,如果有人找到更好的方法或这种方法有缺陷,我将不胜感激。谢谢!