前言
前几天博主在新浪微薄上看到耗子叔叔考察了atoi的编写,周四博主也要面试阿里(ps:虽然博主LNMP方向,但是还是有信心拼一把),这里也自己实现一下这两个函数,防止面试问到答不出来
atoi
#include <stdio.h>
#include <stdlib.h>
#define INT_MAX 2147483647
#define INT_MIN -2147483648
int myatoi(const char *s)
{
int val, flag;
unsigned int cutlim, cutoff;
// 判断是否为空
if (s == NULL) return 0;
// 去除空格和制表符
while (*s == ' ' || *s == '\t')
s ++;
// 判断符号
if (*s == '-') {
flag = 1;
s ++;
} else {
flag = 0;
if (*s == '+')
s ++;
}
// 注意越界
cutoff = flag ? (unsigned int) INT_MAX + 1 : INT_MAX;
cutlim = cutoff % 10;
cutoff /= 10;
for (val = 0; *s >= '0' && *s <= '9'; s ++) {
if (val > cutoff || (val == cutoff && *s - '0' > cutlim)) {
return flag ? INT_MIN : INT_MAX;
}
val = 10 * val + *s - '0';
}
if (flag)
return val * -1;
else
return val;
}
int main(void)
{
char str[100];
int num;
while (scanf("%s", str) != EOF) {
num = myatoi(str);
printf("%d\n", num);
}
return 0;
}
itoa
#include <stdio.h>
#include <stdlib.h>
#define N 15
/**
* 异或交换两个数
*/
void swap(char *a, char *b)
{
if (*a != *b) {
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
}
/**
* 编程实现windows平台整型转字符串代码
*/
void itoa(int value, char *str)
{
int i, j, k;
// 处理负数
if (value < 0) {
str[0] = '-';
value *= -1;
} else {
str[0] = '+';
}
for (i = 1; value; i ++, value /= 10) {
str[i] = value % 10 + '0';
}
// 字符串逆序
for (j = 1, k = i - 1; j <= k; j ++, k --) {
swap(str + j, str + k);
}
// 补字符串结束标识
str[i] = '\0';
// 正数前移一位
if (str[0] != '-') {
for (j = 1; j <= i; j ++) {
str[j - 1] = str[j];
}
}
}
int main(void)
{
int value;
char str[N];
while (scanf("%d", &value) != EOF) {
itoa(value, str);
printf("%s\n", str);
}
return 0;
}