【问题标题】:Is There A Different Way To Process Input Other Than "If" Statements?除了“If”语句之外,还有其他处理输入的方法吗?
【发布时间】:2013-06-09 22:00:04
【问题描述】:

我是 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 语句,如何处理输入并分支到不同的功能?

【问题讨论】:

标签: c logic


【解决方案1】:

在许多情况下,您可以将一系列关于互斥值的 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();
}

...除了编译器可以进一步优化switch

【讨论】:

  • 我从来不知道如何使用“案例”工具。感谢您回答我的问题。
【解决方案2】:

您可以创建一个函数表。一、typedef

typedef void (*feature)();

feature 现在代表指向不带参数并返回 void 的函数的指针。

现在,写(并注意索引的变化)

void feature0() {...}
void feature1() {...}
// ...
void feature9() {...}

然后将它们放入一个数组中:

feature[] actions = {&feature0, &feature1, ..., &feature9};

然后你的代码就变成了(省略了错误检查):

printf("What feature to use?");
int response;
scanf("%d", &response);
actions[response]();

指向函数的指针在调用时被视为实际函数。

【讨论】:

  • 非常感谢您解决这个问题,这是一项很棒的技术。
  • 您还需要编辑您对scanf 的呼叫;我只是剪切和粘贴,你的代码和我的代码都不起作用。您需要将指针传递给函数。请看我上面的编辑版本。
猜你喜欢
  • 1970-01-01
  • 2015-12-08
  • 2012-04-10
  • 2018-12-15
  • 1970-01-01
  • 2021-09-19
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多