详解 itoa 函数并模拟实现

itoa函数用于将整数转换为字符串,接受基数参数,支持2到36之间的进制转换。当基数为10且数值为负时,结果前加负号。函数返回指向生成字符串的指针,要求str数组足够存储所有可能的值。由于itoa不是ANSIC或C++标准部分,可使用sprintf作为替代。文章提供了itoa的模拟实现以及使用示例。
摘要由CSDN通过智能技术生成

目录

一、参数

二、函数说明 

三、返回值

四、可移植性(Portability)

五、示例

六、模拟实现



函数原型:

char* itoa(int value, char* str, int base);

itoa 即 integer to array

所属头文件stdlib.h

一、参数

  1. value:要转换为字符串的整数。

  2. str:内存中的数组,用于存储生成的以 \0 结尾的字符串。

  3. base:基数,必须在 2 ~ 36 范围内,其中 10 表示十进制,16 表示十六进制,8 表示八进制,2 表示二进制。

    base or raidx:a number on which a system of counting and expressing numbers is built up, for example 10 in the decimal system and 2 in the binary system.

    0 ~ 9、a ~ z

二、函数说明 

将整数转换为字符串(Convert integer to string)

  • If base is 10 and value is negative, the resulting string is preceded with a minus sign (-). With any other base, value is always considered unsigned.

    如果基数为 10 并且数字为负,则生成的字符串前面带有减号。对于其他任何基数,value 始终视为无符号

  • str should be an array long enough to contain any possible value: (sizeof(int) * 8 + 1) for radix = 2, i.e. 17 bytes in 16-bits platforms and 33 in 32-bits platforms.

    i.e. 词源是拉丁语 id est,英文含义为 that is/ in other word(即/ 换而言之)

    str 应该是一个足够长的数组,以包含任何可能的值:对于基数 2,应该是 (sizeof(int) * 8 + 1),即 16 位平台中应该是 17 字节,32 位平台中应该是 33 字节

三、返回值

指向生成的以 \0 结尾的字符串的指针,与参数 str 相同

四、可移植性(Portability)

这个函数未在 ANSI-C 中定义,也不是 C++ 的一部分,但某些编译器支持此函数

在某些情况下,符合标准的(standard-compliant)替代方案可能是 sprintf

  • sprintf(str, "%d", value);

    将十进制整数转换为字符串

  • sprintf(str, "%x", value);

    将十六进制整数转换为字符串

  • sprintf(str, "%o", value);

    将八进制整数转换为字符串

五、示例

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char buf[33];
	int num = 0;
	printf("Enter a number:");  // 28
	scanf("%d", &num);

	printf("decimal:%s\n", _itoa(num, buf, 10));  // 28
	printf("binary:%s\n", _itoa(num, buf, 2));  // 11100
	printf("octal:%s\n", _itoa(num, buf, 8));  // 34
	printf("hexadecimal:%s\n", _itoa(num, buf, 16));  // 1c

	sprintf(buf, "%d", num);
	printf("decimal:%s\n", buf);  // 28
	sprintf(buf, "%o", num);
	printf("octal:%s\n", buf);  // 34
	sprintf(buf, "%x", num);
	printf("hexadecimal:%s\n", buf);  // 1c
	return 0;
}

六、模拟实现

char* my_itoa(int value, char* str, int base)
{
	if (base < 2 || base > 32)
	{
		printf("Wrong radix!\n");
		return str;
	}
	char* ret = str;
	if (value == 0)
	{
		*str++ = '0';
		*str = '\0';
		return ret;
	}
	if (base == 10 && value < 0)
	{
		value = -value;
		*str++ = '-';
	}
	char* start = str;
	// 从右到左依次将数字的每一位存储起来
	size_t num = value;
	while (num != 0)
	{
		if (num % base < 10)
		{
			*str++ = '0' + (char)(num % base);
		}
		else
		{
			*str++ = 'a' + (char)(num % base - 10);
		}
		num /= base;
	}
	*str = '\0';
	// 倒置字符串
	for (char* left = start, *right = str - 1; left < right; left++, right--)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
	}
	return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值