天天看点

c语言基础函数——itoa()和atoi()说明

说明

itoa()和atoi()是用来在整数数值和字符串(以'/0'结尾)之间转换的函数。

它们并不是标准C的一部分,但是也很常用,一般编译器都会支持。

itoa()函数的原型如下:

char* itoa(
  int num, 
  char *str, 
  int radix
)
           

其中num表示需要转换的数值,str表示存放转换后的字符串的数组指针,radix表示不同的进制,可以是2,8,16等。返回值同str。

它的实现由很多种,下面一种实现:

char* itoa(int num, char *str, int radix)
{
	/*索引表 */
	char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	unsigned unum;/*中间变量*/
	int i = 0, j, k;

	/*确定unum的值*/
	if (radix == 10 && num < 0)/*十进制负数*/
	{
		unum = (unsigned)-num;
		str[i++] = '-';
	}
	else unum = (unsigned)num;/*其他情况*/
							  /*转换*/
	do {
		str[i++] = index[unum % (unsigned)radix];
		unum /= radix;
	} while (unum);

	str[i] = '\0';
	/*逆序*/
	if (str[0] == '-')
		k = 1;/*十进制负数*/
	else
		k = 0;
	char temp;
	for (j = k; j <= (i - 1) / 2; j++)
	{
		temp = str[j];
		str[j] = str[i - 1 + k - j];
		str[i - 1 + k - j] = temp;
	}
	return str;
}
           

atoi()函数的原型如下:

int atoi (
  const char * str
);
           

其中str表示需要转换的字符串,返回的是对应的整数数值。

它的实现由很多种,下面一种实现:

int atoi(char* pstr) {
	int intVal = 0;	// 返回值
	int sign = 1;	// 符号, 正数为 1, 负数为 -1

	// 判断指针是否为空 pstr == NULL
	if (pstr == 0) 
		return 0;	
	
	// 跳过前面的空格字符 ' ' 的 ascii 值 0x20
	while (' ' == *pstr) 
		pstr++;	

	// 判断正负号
	if ('-' == *pstr) 
		sign = -1;

	// 如果是符号, 指针后移
	if ('-' == *pstr || '+' == *pstr) 
		pstr++;

	while (*pstr >= '0' && *pstr <= '9') {
		intVal = intVal * 10 + (((int)*pstr) - 0x30);
		pstr++;
	}

	// 返回结果,int32 范围是: 2147483647 ~ -2147483648, 此处会进行溢出运算

	return intVal * sign;
}
           

注意上述代码在处理字符串首字符不是ASCII数字也不是加减号时,返回的结果是0,还是有点问题的,但在这样的函数接口下似乎也没有好的办法。

继续阅读