2

我正在用 Java 编写一个 Atoi 函数。对于 +ve 整数,它运行良好。但是我想要的是当我输入一个负整数时它应该给我一个错误。所以我尝试在我的 Atoi 类中包含 continue 语句。实现的类是:

class Atoi {

    int atoi(String tmp) {

    int result = 0;

        for (int i = 0; i < tmp.length(); i++) {

            char digit = (char)(tmp.charAt(i) - '0');

        if(digit == '-')

        continue;
        }

        else {

            result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

    return result;

    }
}   

但不幸的是,它给了我这个字符的负等价物,即 -12 它给了我 655312!帮助。

编辑:假设我需要检查浮点数我该怎么办?如果我输入 12.1 或 123.2 它应该分别返回 12.1 和 123.2 !!

4

6 回答 6

2

而不是continue你应该给出一个错误(抛出一个异常,return -1或者你所说的“给出一个错误”)。

如果您想忽略,-可以将 else 子句更改为:

result = digit + result * 10;
于 2012-11-06T13:36:29.373 回答
1

快速修复明显问题:逻辑顺序错误......

代替

    char digit = (char)(tmp.charAt(i) - '0');
    if(digit=='-')
    continue;

尝试

    char origChar=tmp.charAt(i);
    if(origChar=='-')
        continue;
    char digit = (char)(origChar - '0');

但是还有两个问题:

  • 如果存在“-”字符,它不会否定该值!
  • 如果这是输入字符串:-1-2-3-4-5 怎么办?结果会很有趣!编辑:也试试这个输入:'répa'......更有趣的结果!

不要忘记使用不正确的输入进行测试,正如@Klaus 建议的那样,如果向函数提供了不正确的输入,请毫不犹豫地抛出异常(最好是IllegalArgumentException )并提供正确的错误消息......

于 2012-11-06T13:34:53.737 回答
1

当然,您可以编写这样的代码,但您需要检查tmp是否为有效数字。

int atoi(String tmp) {

    int result = 0;

    int factor = tmp.charAt(0) == "-" ? -1 : 1;

        for (int i = 0; i < tmp.length(); i++) {

            if (tmp.chatAt(i) < '0' ||  tmp.chatAt(i) > '9') 

                continue;

                char digit = (char)(tmp.charAt(i) - '0');

                result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

        return result * factor;
}
于 2012-11-06T13:51:04.637 回答
1

如果这不是作为编程练习来完成的,那么有一个更简单的解决方案:

  static int atoi(String tmp)
  {
      int result = Integer.parseInt(tmp);
      if(result >= 0) {
         return result;
      } else {
         throw new IllegalArgumentException("Negative string "+"\"" + tmp + "\"");
      }
  }

在否定结果情况下替换适当的异常或其他操作。如果您只想忽略“-”,如发布的代码中所示,请将 if-then-else 替换为:

      return Math.abs(result);

此代码还会为“abc”之类的字符串引发异常。

更一般地说,如果一个库方法不能完全按照您的要求做,通常很容易在修改其行为的方法中使用它,而不是重新编写它。

于 2012-11-06T14:02:27.617 回答
0

如果您不想转换负数,则只需在遇到-符号时返回 0 而不是进一步循环。将此代码放在 if-else 块之前。

     if(tmp.charAt(i)=='-')  
         return 0;
于 2012-11-06T13:35:22.460 回答
0
if(digit=='-')

(char)(tmp.charAt(i)

你的代码假设没有 - 的

(char)(tmp.charAt(i) - '0');

是一种盲目地将“数字”变量限制为数字的优化。

您需要逐步了解您的代码实际在做什么,搜索 ASCII 图表并完成减法 '0' 的作用('0' == 48),所以 '1' (49) - '0' (48 ) = 1 等等...

于 2012-11-06T13:38:36.917 回答