【问题标题】:What should an int function return if the input is invalid? [duplicate]如果输入无效,int 函数应该返回什么? [复制]
【发布时间】:2011-03-26 06:19:17
【问题描述】:

可能重复:
Error checking a function that returns an int

我有一个整数函数,它返回一个大范围的整数(在 C 中)。 我应该如何处理无效输入?我的意思是如果输入无效,它应该返回什么? 对不起,如果这个问题太基本了。我没有经验,在其他任何地方都找不到答案。

【问题讨论】:

标签: c exception-handling


【解决方案1】:

取决于取值范围。例如,如果您的函数只希望在成功时返回正值,则返回 -1 表示错误。如果它通常只返回值 >0,则在错误时返回 0。

如果它返回 int 范围内的任何可能值,那么您可能需要不同的方法,例如

bool GetValue(int inputValue, int *outResult);

您的函数将结果存储在 outResult 中,如果发生错误则返回 false。

【讨论】:

  • @EboMike 所以 -1 现在是正值了吗?
  • 显然,我是在说“如果函数成功完成后可能的返回值为正”。这个想法是,如果函数调用成功,您希望返回一个错误值,该值可能无法返回。
  • 我会始终返回 -1 以指示错误,即使 0 不是要返回的有效值。这样 -1 总是意味着错误,而不是有时 -1 和其他时候 0。
  • @EboMike 哦等等,对不起。我把它误读为“如果你的函数 can 只能返回正值”
  • @Rafe Kettler, victor23k: en.wikipedia.org/wiki/Stdbool.h
【解决方案2】:

您的输出范围是否为负数?如果不是,-1 是一个合理的标准返回代码。你从哪里得到输入?

【讨论】:

  • 输入来自用户,输出不包含负数。但也有其他 int 函数接受来自其他函数而不是用户的输入。我应该从非主 int 函数中终止程序吗?还是应该检查 main 中的返回值是否为 -1 并从那里终止?
【解决方案3】:

这个输入来自哪里?我假设来自用户或文件。忘记该死的 C 函数希望返回调用的任何内容,我建议在函数开头检查输入是否为 int:

if (userinput/1.00 == (int)userinput)
     We have an integer! Rest of the function goes here...
else
     Do something else like abort the function and change the 'input'...

请原谅任何低效/不正确的代码,我自己就是编程菜鸟。

【讨论】:

    【解决方案4】:

    确实没有适用于所有情况的标准方法。 -1 是常见的“一般错误”返回值。你也可以像这样做一堆定义:

    #define MEMORY_ERROR  1
    #define OUT_OF_BOUNDS 2
    #define ...           3
    etc...
    

    然后你可以这样做:

    int func()
    {
      ...
      ...
      if(condition) {
        // Error handling
        return MEMORY_ERROR;
      }
      ...
      if(condition) {
        // Error handling
        return OUT_OF_BOUNDS;
      }
    }
    

    或类似的东西。

    【讨论】:

      【解决方案5】:

      在用缺乏异​​常处理的语言编写代码时,我的偏好是始终使用返回值作为错误指示符。

      int get_value(int *value)
      {
          if ( input_ok )
              *value = input;
              return 0;
          return -1;
      }
      

      这似乎不切实际,因为它迫使您使用中间变量来存储函数结果,但它多次证明对捕获错误并正确处理它们很有用(您永远不能依赖用户输入)。

      另外,您应该注意,使用特殊值来显示错误并不是一个好主意:您永远不知道您的代码会发生什么。如果以后你想添加一个新特性,不幸的是这个特殊值对这个特性很有用,你会怎么做?用另一个特殊的错误值编写一个新函数?如果输入应该涵盖返回类型的整个范围怎么办?如果这是一个更大项目的一部分,你如何确保每个可能使用你的函数的程序员都知道它的特殊价值?

      所以在安全方面犯错:不要使用特殊值并使用专用的错误处理路径。

      注意你可以把上面的代码倒过来写int get_value(int *error);

      【讨论】:

        猜你喜欢
        • 2015-12-23
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2020-02-06
        • 2012-12-04
        • 2014-05-31
        • 1970-01-01
        相关资源
        最近更新 更多