我可以编写一个可以在C中返回一种数据类型或另一种数据类型的函数吗?

时间:2018-12-22 21:11:54

标签: c

如何制作一个返回零或数字数组的函数。我的函数应该测试输入的字符串是否带有两个用十六进制数字隔开的字符串,例如:"a48 2b4"。如果符合条件,则返回由两个数字组成的int数组;如果没有,则返回0,例如,如果它具有非十六进制字符或太多空格,则返回0。

2 个答案:

答案 0 :(得分:1)

由于在任何情况下都无法直接返回数组,因此您将需要修改计划。首先考虑一下,您描述的两种备选回报在很大程度上是不相关的-一种是数据,另一种是状态码。它们不适合作为替代方案,这就是您苦苦挣扎的原因之一。

一个不错的,干净的设计将遵循注释中建议的@ try-catch-finally建议:让调用者将数组(作为指针)传递给函数作为参数。成功后,该函数将填充前两个元素(依赖于调用者提供了适合于此的指针)。函数的实际返回值可以是状态码。我猜想您的思考方式是:失败时为0,成功时为其他(1?),尽管这与大多数标准库函数的处理方式相反。

示例:

int parseHex(const char *str, int *parsed_result) {
    // ...
    if (success) {
        parsed_result[0] = hex0;
        parsed_result[1] = hex1;
        return 1;
    } else {
        return 0;
    }
}

您还可以使用至少两种其他方法来解决此问题,但这是干净且一致的,并且不会使调用者承担释放动态分配的内存的任何新责任。

答案 1 :(得分:1)

我也可以使用 Union 。联合可以存储两种或多种类型的值。

private void slideFragment(Fragment fragment) {
        Slide slide = new Slide();
        slide.setDuration(250);
        slide.setSlideEdge(Gravity.RIGHT);
        fragment.setEnterTransition(slide);
    }

slideFragment(fragment);

        getSupportFragmentManager().beginTransaction()
                .addToBackStack(null)
                .replace(R.id.container_overlay, fragment, Integer.toString(getFragmentCount()))
                .commit();