atoi和itoa的编程实现

前言

前几天博主在新浪微薄上看到耗子叔叔考察了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;
}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值