Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
题目大意
实现atoi 函数用于将string转换成integer。
难度系数: 容易
实现
这是我的实现,通过LeetCode测试。
int atoi(const char *str)
{
if (strlen(str) == 0) {
return 0;
}
int i = 0;
int val = 0;
bool sign = false;
for (i = 0; str[i] != '\0'; ++i) {
if (str[i] == ' ' || str[i] == ' ') {
continue;
}
break;
}
if (strlen(str+i) == 0) {
return 0;
}
if (str[i] == '-') {
sign = true;
i++;
}
for (; str[i] != '\0'; ++i) {
if (str[i] < '0' || str[i] > '9') {
break;
}
if (sign) {
if (val < INT_MIN / 10 || (val == INT_MIN / 10 && (str[i] -'0') >= INT_MIN % 10 * -1 ))
return INT_MIN;
val = val * 10 - (str[i] -'0');
} else {
if (val > INT_MAX / 10 || (val == INT_MAX / 10 && (str[i] -'0') >= INT_MAX % 10))
return INT_MAX;
val = val * 10 + str[i] - '0';
}
}
return val;
}
这代码虽然通过测试了。但是我别人的代码后,还是觉得有点问题。
-
要不要判断str为NULL时的情况,这个我觉得可以不用,很多C函数其实也是这样,你传个空指针是会崩溃的。 就这个函数而言,你传个空指针,几乎可断定,就是你的代码出问题了。这个函数接受空指针会Segmentation fault, 看似简单粗暴,实际就很恰当的做法,毕竟你期望的参数不是空指针,在该函数之前就已经出问题了,继续运行并不是个好办法。 如果你觉得需要考虑NULL的情况,那你可以加上判断。
-
判断空字符,是否是数字,这里我没有调用库函数isspace或isdigit来实现,这是我写的不好的地方。调用库函数,可以提高 移植性。