【Linux基础】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,还是有点问题的,但在这样的函数接口下似乎也没有好的办法。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值