C 编程/stdlib.h/itoa
出现
itoa(integer to ASCII)函数是标准 C 编程语言的广泛非标准扩展。它不能移植地使用,因为它没有在任何 C 语言标准中定义;但是,编译器通常通过头文件 <stdlib.h>
在非标准模式下提供它,因为它是在标准库函数 atoi
的逻辑对应物。
void itoa(int input, char *buffer, int radix)
itoa
接受整数输入值 input
并将其转换为以 radix
为基数的数字。结果数字(以 radix
为基数的数字序列)被写入到输出缓冲区 buffer
中。
根据实现方式,itoa
可能返回指向 buffer
中第一个字符的指针,或者设计为如果传递一个空 buffer
则该函数将返回本来写入到有效 buffer
中的字符串的长度。
要将数字转换为以 8(八进制)、10(十进制)或 16(十六进制)为基数的字符串,可以使用标准库函数 sprintf
作为标准合规的替代方案。
函数 itoa
出现在 Kernighan 和 Ritchie 的《C 编程语言》第一版中,第 60 页。第二版《C 编程语言》(“K&R2”)包含 itoa
的以下实现,第 64 页 [对于西班牙语版本,请参阅第 47 页]。这本书指出该实现存在几个问题,包括它没有正确处理最负数 -2字长-1。[1]
/* itoa: convert n to characters in s */
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
s[i++] = n % 10 + '0'; /* get next digit */
} while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
上面使用的函数 reverse
在前面两页实现。
#include <string.h>
/* reverse: reverse string s in place */
void reverse(char s[])
{
int i, j;
char c;
for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
itoa
函数(以及类似的函数 ftoa
,它将浮点数转换为字符串)在第一版 Unix 手册中列出。[2] 不同于上面的版本,Unix 库版本具有大致等效于以下内容的接口:
void itoa(int input, void (*subr)(char))
它将在输出字符串中的每个字符上调用回调例程 subr
,从而消除了需要一个足够大的缓冲区来容纳整个字符串。
- ↑ 有关此练习的解决方案,请参阅 clc-wiki.net 上的 "K&R2 solutions"。
- ↑ "Unix Programmer's Manual",1971 年 11 月 3 日。部分 "Library routines"。
- 带性能测试的 itoa() 实现
- lexical_cast - C++ 替代方案,是 boost 库的一部分。
- modp_numtoa - 用于将整数和浮点数转换为字符缓冲区的 C/C++ 替代方案。
- Good old Integer To Ascii conversion: itoa - 针对各种数据类型的 itoa 的另一种快速实现,以及以 boost::lexical_cast 模板特化形式的某些 boost 风格的包装。