将用户输入字符串与宏名称进行比较

标签 c database string macros string-comparison

我正在尝试制作一个查找表。这是借口:

假设以下是某些宏的定义列表。

#define ENTITY1 0x10001001
#define ENTITY2 0x10001002
.
.
.

ENTITY_ 是无符号长整数类型值的用户可读字符串值,并且可以有任意数量的宏(例如大于 200,甚至 500)。

现在,有一个列表可以跟踪哪个文件号中存在哪个实体。像这样的事情:

 0x10001001 1
 0x10001002 2
 0x10001003 3
 .
 .
 .

由于专有约定,每个实体都必须使用长无符号整数。

第一个列表已经存在,第二个列表需要在用户输入记录时使用第一个列表的 #defines 中的宏字符串通过程序生成。 由于此类条目的数量非常大,因此对每个值进行硬编码是一项繁重的任务。此外,如果第一个列表已更新,如果未对其他开关情况进行编码,则第二个列表将不会相应更新。

当用户进行输入时,他告诉该输入将通过字符串变量在 ENTITY3 中进行,系统应查找是否存在名为 ENTITY3 的宏。如果是,则打开编号为3的文件并进行必要的处理,否则,显示警告该条目不存在。

那么,如何在不使用 SWITCH CASE 的情况下将用户输入的字符串变量与宏名称进行比较?

我正在使用C编程。 GNU C 库。

<小时/>

编辑:这是场景。

名为ENTITYn(n可以是任意数字)的不同实体可以存在于不同的文件中,这些文件具有特定的整数1,2,3... 但是,专有环境已经构建了这些实体,以便使用某些无符号长整数(如 0x01001001 等)来识别它们。对于每个实体,宏已在与这些实体相对应的一些头文件中定义,名称为 ENTITY1 ENTITY2... 现在,当某个经理想要更改某些内容或将某些数据输入到特定实体时,他将通过名称 ENTITYn 进行寻址,并且程序将在查找表中查找相应的条目。如果找到匹配项,它将使用该实体的无符号长整数代码进行专有系统内部的后续处理,访问另一个查找表,查找哪个文件号具有此条目并打开该文件位置进行处理。

我需要用实体的无符号长整型及其相应位置填充第二个表(现在让它们全部位于单个文件 1 中)。我想规避这样的条件:制作 LUT 的人必须知道相应的实体无符号长整数代码。该程序使用输入字符串,即 ENTITY1 并直接映射它。

但现在我开始认为对 LUT 进行硬编码将是更好的选择。 :)

最佳答案

C 程序中不存在宏名称。预处理器已用其替换值替换了宏名称的每个实例。如果我正确理解您的问题,您可能需要某种查找表,例如:

#define ENTITY1 0x10001001
#define ENTITY2 0x10001002
#define STR(x) #x

struct lookup { char *name; unsigned value; } ;
struct lookup mylut[] = {
{ STR(ENTITY1), ENTITY1 }
, { STR(ENTITY2), ENTITY2 }
};

预处理器会将其扩展为:

struct lookup { char *name; unsigned value; } ;
struct lookup mylut[] = {
{ "ENTITY1", 0x10001001 }
, { "ENTITY2", 0x10001002 }
};

,您可以使用它来查找字符串文字。

关于将用户输入字符串与宏名称进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598222/

相关文章:

C启动代码只写汇编困惑

c - C 中的全局指针?

database - 如何使用 Visual Studio Code 查看 SQLite 数据库内容

python - 从这个列表中获取 playAudio 调用的参数的优雅方法是什么

python - 将一串空格分隔的单词拆分为多行

c - 即使在具有正确的目标输入值后,if 语句也会产生错误行为

c - 为什么在 Visual Studio 6.0 中找不到 errno?

sql - 3 MySQL 中的表连接

mysql - 与同一实体的记录的数据库关联关系

java:尝试通过方法从字符串数组返回字符串值