找工作之“整数转化为字符串---itoa实现“

整数转化为字符串,就是itoa函数(http://www.cplusplus.com/reference/cstdlib/itoa/),例如输入123,得到字符串“123”。还算简单,自己实现一下还是比较有意思的。

/***************
最初的版本
****************/
void convIntToStr(int n)
{
	int signFlag = 0;
	char str[10];
	int bitsNum = 0;
	int i = 0;

	if(n < 0)
	{
		signFlag = 1;
		 n = -n;
	}

	for( ; ;)
	{
		unsigned int quotient = 0;
		unsigned int remainder = 0;
		
		
		quotient = n / 10;
		remainder = n % 10;
		str[bitsNum++] = remainder + '0';
		n = quotient;

		if(quotient == 0)
			break;
	}

	if(1 == signFlag)
		printf("-");
	for(i = bitsNum -1; i >= 0; --i )
		printf("%c",str[i]);
		//putchar(str[i]);
}

//"递归实现" 方案
void convIntToStr2(int n)
{
	if(n < 0)
	{
		putchar('-');
		n = -n;
	}

	if( n / 10)
		convIntToStr2(n / 10);
	putchar(n % 10 + '0');
}

//字符串倒序函数
void reverse(char s[])
{
	int i = 0, j = 0;
	char c = '0';

	for(i = 0, j = strlen(s) - 1; i < j; ++i, --j)
	{
		c = s[i]; s[i] = s[j]; s[j] = c;
	}
}

//参考“c语言程序设计一书”优化的版本。
void convIntToStr3(int n)
{
	int sign = 0, i = 0;
	char str[10];
	char * p = str;

	if((sign = n) < 0)	
		n = -n;
	

	do{
		str[i++] = n % 10 + '0';		
	}while((n /= 10) > 0);

	if(sign < 0)
		str[i++] = '-';
	str[i] = '\0';

	reverse(str);

	while(*p)
		putchar(*p++);			
}

/**
* 网上找的“很牛逼的解决方案”----大牛写的实现就是不一样啊。。。
*/
char * itoa(int value, char * result, int base) 
{
	// check that the base if valid
	if (base < 2 || base > 36) 
	{ 
		*result = '\0';
		return result; 
	}

	char * ptr = result, * ptr1 = result, tmp_char;
	int tmp_value;

	do {
		tmp_value = value;
		value /= base;
		*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
	} while(value);

	// Apply negative sign
	if (tmp_value < 0) 
		*ptr++ = '-';
	
	*ptr-- = '\0';
	
	while(ptr1 < ptr) 
	{
		tmp_char = *ptr;
		*ptr--   = *ptr1;
		*ptr1++  = tmp_char;
	}
	
	return result;
}

测试无误。

你可能感兴趣的:(c,工作,itoa实现)