由char

时间:2017-05-14 01:23:19

标签: c

我正在编写一个文本编辑器,根据用户输入的第一个字符执行命令。

例如,如果用户输入r filename.foo,则字母r将用于调用read_file()功能。显而易见的方法是使用switch(buf[0]),但我想使用函数指针数组,因此我可以说(*fn[buf[0])而不是写出长switch语句。 (有关此设计模式的进一步说明,请参阅Kernighan和Pike"编程实践"第221页。)

我尝试使用enum将每个字符与一个整数相关联,enum { 'r', 'w', 't', '\n' };将映射' r'到int 0,' w'到int 1,' t',到int 2,' \ n'到int 3,但C不允许使用字符。是否有一种优雅的方式来做到这一点?

1 个答案:

答案 0 :(得分:2)

在C中执行此操作的正确方法是使用指定的初始值设定项。

#include <stdio.h>

void read(void)
{
    puts("read");
}

void write(void)
{
    puts("write");
}

typedef void (*function_map_t)(void);

function_map_t function_map[] = {
    ['r'] = read,
    ['w'] = write,
};

如果要修复数组的大小,请使用function_map [255]。根据标准的要求,所有缺失的条目都用零初始化。

https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html