C 基于用户输入确定颜色

C 基于用户输入确定颜色,c,parsing,input,compare,C,Parsing,Input,Compare,我正在用C语言为我的光线跟踪器开发一个解析器,用于读取用户输入(描述场景)。我希望用户能够以这种格式以颜色书写: sphere: { position: 0, 0, 0 radius: 1 color: white } 我想给用户很多选择。过去,对于其他项目中的颜色,我使用了一个大的头文件,其中定义了十六进制格式的颜色,如下所示: # define BLACK 0x000000 ... // Returns number of loaded colors, or -1 on error

我正在用C语言为我的光线跟踪器开发一个解析器,用于读取用户输入(描述场景)。我希望用户能够以这种格式以颜色书写:

sphere:
{
 position: 0, 0, 0
 radius: 1
 color: white
}
我想给用户很多选择。过去,对于其他项目中的颜色,我使用了一个大的头文件,其中定义了十六进制格式的颜色,如下所示:

# define BLACK 0x000000
...
// Returns number of loaded colors, or -1 on error.
int colordb_init(const char *filename);

// Returns true on success, false if the color is not known.
bool colordb_lookup(const char *name, uint32_t *rgb);
但我不能完全重复我的定义并与用户输入进行比较。。。 阅读用户输入并确定用户给出的颜色最实用的方法是什么?记住,我有几十种颜色,我希望能够轻松添加新颜色。我有点想避免对每种颜色都这样做:

if (!strcmp(user_input, "red"))
    return (0xFF0000);
if ...
但是,有没有一种切实可行的方法,可以通过预定义的颜色和值表在循环中执行此操作?

嗯,最简单的(?)可能是不硬编码,而是:

  • 定义定义颜色的文本格式(可以是超级简单的格式,每行只有一个名称和一个十六进制三元组)
  • 在启动时读取文件一次
  • 为快速搜索准备内存中的数据:对其进行排序(使用),以便可以使用二进制搜索(使用)
  • 然后,无论何时需要查找颜色,在颜色文件数据中进行搜索,就完成了

    我想象一个API可能是这样的:

    # define BLACK 0x000000
    ...
    
    // Returns number of loaded colors, or -1 on error.
    int colordb_init(const char *filename);
    
    // Returns true on success, false if the color is not known.
    bool colordb_lookup(const char *name, uint32_t *rgb);
    
    这一切都可以在大约100-150行代码中实现,并且速度非常快(二进制搜索压缩数组非常快),但我并不认为颜色查找的速度很快就会成为光线跟踪器的瓶颈。:)


    通常在Unix:y系统的磁盘上可用,否则您可以从Wikipedia复制粘贴它作为起点。

    看起来更像是哈希表的应用程序。无论如何,这个问题太宽泛了。像这样的解决方案正是我想要的!由于这是一个学校项目,我只能使用哪些功能。在这种情况下,我必须创建自己的qsort和bsearch,但是拥有一个外部文件并在启动时解析它的想法非常好。谢谢你能试试嵌套的for循环吗?来自@Christian Ceballos(没有足够的代表评论):你能试试嵌套的for循环吗?