假设我有一个如下所示的文件:
rotate -45
move 30
rotate
和move
是我写的两个函数。
但是我正在从文本文件中读到这些内容。
那么,我如何能够将这些作为我的程序的命令?
我正在考虑使用strcmp
。所以我将我读过的字符串与我所知道的字符串作为可能的命令进行比较。然后,如果它们匹配,我想调用所请求的函数。
我真的希望看到一些示例代码来帮助理解。
感谢您的提示。 所以使用brunobeltran0的第一种方法,我会这样做:
char*next_command;
char* get_next_command;g = fopen("b", "r");/*b is the name of the file*/
while(!feof(g))
{
get_next_command=fgetc(g);
next_command = strtok(get_next_command, " ");
while (next_command != NULL) {
printf("%s\n", next_command);
next_command = strtok(NULL, " ");
if (!strcmp(next_command, "rotate"))
{
rotate (/*how would I get the number to be in here*/ )
}`
这看起来不对。我想念你们吗?
答案 0 :(得分:2)
我将假设你的意思是你想要编写一个程序,给定一个充满它理解的命令的输入文件,从所述输入文件中读取并执行这些命令。 根据你拥有的命令数量,以及你对这些函数的格式化了解,周围的代码可能会有明显的不同,但在一般情况下,逻辑会有所不同(忽略内存管理) )
char *next_command = get_next_command(...); // reading the commands is really specific to the input you expect
if (!strcmp(next_command, "some_command"))
{
void *param_arr[PARAM_CNT_FOR_SOME_COMMAND] = get_params_for_some_command();
some_command(param_arr[0], param_arr[1], param_arr[2]); // assume some_command takes 3 arguments
}
else if (!strcmp(next_command, "some_other_command"))
...
例如,如果要旋转-45,
char *next_command = get_next_command(...); // reading the commands is really specific to the input you expect
if (!strcmp(next_command, "rotate"))
{
void *param_arr[1] = get_rotation_angle();
rotate((int *)param_arr[0]); // assume some_command takes 3 arguments
}
应该有用。
如果你有一个可用的地图,那么从可能的输入命令映射到它们各自的函数,并允许函数从文件本身读取以查找它的参数可能会更有效。
例如:
char *next_command = get_next_command(file_pointer);
(*get_func_pointer(next_command))(file_pointer); // where get_func_pointer is a function that
// returns the function pointer assoc. with 'next_command'
/* somewhere else in the code */
void func_returned_by_get_func_pointer(FILE *fp)
{
read_params_from(fp);
do_everything_as_usual();
}
答案 1 :(得分:1)
我会这样做:
HTH。
答案 2 :(得分:0)
尝试尽可能地将解析器/调度代码与函数分离。这显示了一个适用于您的示例案例的调度程序示例:
typedef int (*Command)(double);
struct CommandEntry {
const char *name;
Command function;
};
int dispatch_commands(struct CommandEntry *commands, int num_commands,
const char *name, double param)
{
/* loop over the arguments, look for a CommandEntry with a matching name,
convert its parameter and then call it */
int i;
for (i = 0; i < num_commands; ++i) {
if (!strcmp(commands[i].name, arg))
return commands[i].*function(param);
}
return -1;
}
struct CommandEntry commands[] = {
{"rotate", &my_rotate_func},
{"move", &my_translate_func}
};
这假设所有命令都采用double
类型的单个参数,当然......如果所有命令都是同质的,则可以使其工作。否则,您需要指定每个CommandEntry
中的参数数量(并传递一个数组,因为函数类型仍需要相同),或者为每个命令函数提供整个传入令牌流,并且允许它消耗尽可能多的令牌。