Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否有不同的方式来处理输入,而不是;如果;声明?_C_Logic - Fatal编程技术网

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) {

我是一个C和编程的初学者(我已经用C/C++编程两年了),我所做过的唯一类型的程序是命令行数学处理器,它接受参数并对它们进行操作。不存在基于输入内容的分叉。我不知道如何做这样的事情,所以我最近一直在做的是以如下方式设计我的程序:

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]();