目录
函数原型:
char* itoa(int value, char* str, int base);
itoa 即 integer to array。
所属头文件:stdlib.h
一、参数
-
value:要转换为字符串的整数。
-
str:内存中的数组,用于存储生成的以
\0
结尾的字符串。 -
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 andvalue
is negative, the resulting string is preceded with a minus sign (-
). With any otherbase
,value
is always considered unsigned.如果基数为 10 并且数字为负,则生成的字符串前面带有减号。对于其他任何基数,
value
始终视为无符号。 -
str
should be an array long enough to contain any possible value:(sizeof(int) * 8 + 1)
forradix = 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;
}