C 是否有不同的方式来处理输入,而不是;如果;声明?
我是一个C和编程的初学者(我已经用C/C++编程两年了),我所做过的唯一类型的程序是命令行数学处理器,它接受参数并对它们进行操作。不存在基于输入内容的分叉。我不知道如何做这样的事情,所以我最近一直在做的是以如下方式设计我的程序:C 是否有不同的方式来处理输入,而不是;如果;声明?,c,logic,C,Logic,我是一个C和编程的初学者(我已经用C/C++编程两年了),我所做过的唯一类型的程序是命令行数学处理器,它接受参数并对它们进行操作。不存在基于输入内容的分叉。我不知道如何做这样的事情,所以我最近一直在做的是以如下方式设计我的程序: printf("What feature to use?"); int response; scanf("%d", response); if (response == 1) { feature01(); } if (response == 2) {
printf("What feature to use?");
int response;
scanf("%d", response);
if (response == 1)
{
feature01();
}
if (response == 2)
{
feature02();
}
。。。我继续这样。对于我的程序,通常只有不到10个独特的功能,这是可以的,但只是暂时的。如果我曾经编写过一个具有50-100个独特分支功能的程序,那么可能会有一个问题。如何处理输入并分支到不同的功能,而不以上述方式使用if语句?在许多情况下,您可以将一系列关于互斥值的
if
语句替换为switch
:
switch (response)
{
case 1:
feature01();
break;
case 2:
feature02();
break;
default:
featureXX();
break;
}
这大致相当于:
if (response == 1)
{
feature01();
}
else if (response == 2)
{
feature02();
}
else
{
featureXX();
}
…除了编译器可以进一步优化
开关之外。您可以创建一个函数表。首先,一个typedef
typedef void (*feature)();
feature
现在表示指向不带参数并返回void
的函数的指针
现在,写(注意索引的变化)
然后将它们放入一个数组中:
feature[] actions = {&feature0, &feature1, ..., &feature9};
然后您的代码变为(错误检查遗漏):
调用函数时,指向函数的指针将被视为实际函数。?您需要的是多个分派。非常感谢您解决了这个问题,这是一个很好的技术。您还需要编辑对scanf
的调用;我只是剪切和粘贴,你的代码和我的代码都不起作用。您需要向函数传递指针。请看我上面编辑的版本。我从来不知道如何使用“案例”工具。谢谢你回答我的问题。
feature[] actions = {&feature0, &feature1, ..., &feature9};
printf("What feature to use?");
int response;
scanf("%d", &response);
actions[response]();