对于一个atoi函数,需要注意好多点:
1 字符串是否为空
2 前面是空白符
3 第一个字符是'+'或'-'
4 输入的字符要是整数字符
5 对于小数点的情况,标准atoi函数是截断了。因为这个函数的功能就是转换成整数,小数部分会截断。
要写一个无错误的函数,还真不容易,下面是代码:
int myatoi(char *str)
{
assert(str != NULL);
int i = 0;
//越过空白符
while (str[i] == ' ' || str[i] == '\n' || str[i] == '\r' ||
str[i] == '\t')
i++;
//判断第一个字符是否为符号
int flag = 0;
if (str[i] == '-' || str[i] == '+')
{
if (str[i] == '-')
flag = 1;
i++;
}
int val = 0;
while (str[i] != '\0')
{
if (str[i] >= '0' && str[i] <= '9') //计算数值
val = val * 10 + str[i] - '0';
else
{
if (str[i] == '.')
break;
else
{
printf("字符错误\n");
exit(1);
}
}
i++;
}
return flag == 1 ? val*(-1) : val;
}
哎,今天上午面百度,写一个二分查找,细节部分全部没注意到,再写一遍把,不知道会不会有而面通知,真是伤心。一到面试就懵了,真是笨.
二分查找应该考虑的情况:
1 数组指针为空
2 n为负数
3 边界情况
int bsearch(int *arr, int n, int val)
{
assert(arr != NULL);
if (n < 0)
{
printf("n不能小于0");
return -1;
}
int i = 0;
int j = n-1;
int mid = 0;
while (i <= j)
{
mid = (i+j)/2;
if (arr[mid] == val)
return mid;
else if (arr[mid] < val)
i = mid+1;
else
j = mid-1;
}
return -1;
}