经典面试题 atoi&itoa

 

long  atol(const char *nptr)
{
	int c; /* current char */
	long total; /* current total */
	int sign; /* if ''-'', then negative, otherwise positive */

	/* skip whitespace */
	while ( isspace((int)(unsigned char)*nptr) )
	++nptr;

	c = (int)(unsigned char)*nptr++;
	sign = c; 
	if (c == ''-'' || c == ''+'')
		c = (int)(unsigned char)*nptr++; 

	total = 0;

	while (isdigit(c)) {
	total = 10 * total + (c - ''0''); /* accumulate digit */
	c = (int)(unsigned char)*nptr++; /* get next char */

	}

	if (sign == ''-'')
		return -total;
	else
		return total; /* return result, negated if necessary */
}

 

 

char* _itoa(int value, char* string, int radix)
{
	char tmp[33];
	char* tp = tmp;
	int i;
	unsigned v;
	int sign;
	char* sp;

	if (radix > 36 || radix <= 1)
	{
		__set_errno(EDOM);
		return 0;
	}

	sign = (radix == 10 && value < 0);
	if (sign)
		v = -value;
	else
		v = (unsigned)value;

	while (v || tp == tmp)
	{
	i = v % radix;
	v = v / radix;
	if (i < 10)
		*tp++ = i+''0'';
	else
		*tp++ = i + ''a'' - 10;
	}

	if (string == 0)
		string = (char*)malloc((tp-tmp)+sign+1);
	sp = string;

	if (sign)
		*sp++ = ''-'';
	while (tp > tmp)
	*sp++ = *--tp;
	*sp = 0;
	
	return string;
}
posted @ 2011-09-13 17:55  caleb yuan  阅读(257)  评论(0编辑  收藏  举报