我正在用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!
答案 0 :(得分:2)
而不是continue
你应该给出错误(抛出异常,return -1
或任何你的意思“给出一个错误”)。
如果要忽略-
,可以将else子句更改为:
result = digit + result * 10;
答案 1 :(得分:1)
快速解决明显问题:逻辑顺序错误......
而不是
char digit = (char)(tmp.charAt(i) - '0');
if(digit=='-')
continue;
试
char origChar=tmp.charAt(i);
if(origChar=='-')
continue;
char digit = (char)(origChar - '0');
但还有两个问题:
不要忘记使用不正确的输入进行测试,正如@Klaus建议的那样,如果输入的输入不正确,请不要犹豫,抛出异常(最好是IllegalArgumentException)并输入正确的错误消息功能......
答案 2 :(得分: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;
}
答案 3 :(得分: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”等字符串抛出异常。
更一般地说,如果库方法没有完全符合您的要求,通常很容易在修改其行为的方法中使用它,而不是重写它。
答案 4 :(得分:0)
如果您不想转换负数,那么只要您遇到-
符号而不是进一步循环,只需返回0。将此代码放在if-else块之前。
if(tmp.charAt(i)=='-')
return 0;
答案 5 :(得分:0)
if(digit=='-')
使用
(char)(tmp.charAt(i)
你的代码是假设没有 -
(char)(tmp.charAt(i) - '0');
是一种盲目地将'digit'变量钳制到数字的优化。
您需要逐步完成代码实际执行的操作,搜索ASCII图表并查看“0”的减法('0'== 48),以便'1'(49) - '0 '(48)= 1等...