为什么要区分这两者?我曾经以为itoa
在stdlib.h
中,结果导致我链接了一个带有不同参数的自定义版本的itoa
并产生了一些疯狂的错误。
那么,为什么itoa
不是标准函数呢?它有什么问题吗?为什么标准更倾向于它的孪生兄弟atoi
?
至今没有标准化的itoa
方法,因此如果要将其添加到标准库中,需要有充分的理由和良好的接口。
我见过的大多数itoa
接口都使用静态缓冲区,存在可重入性和生命周期问题,或者分配动态缓冲区,调用者需要释放内存,或者要求用户提供缓冲区,使接口与sprintf
相比不具优势。
sprintf
可能比仅用于int
格式化程序的工具更加复杂,但我仍然不认为这种差异是“巨大的优势”。也许我没有完全理解你所考虑的情况。 - CB Baileyprintf()
。 - btaitoa
函数不是标准函数,可能的原因是它没有一致的定义。不同的编译器和库供应商引入了略微不同版本的itoa
,可能是作为atoi
的补充发明的。itoa
的版本,因此这种函数无法添加到ISO C中。无论描述什么行为,都会与某些实现不符。
itoa
已经以以下形式存在:void itoa(int n, char *s); /* Given in _The C Programming Language_, 1st ed. (K&R1) */
void itoa(int input, void (*subr)(char)); /* Ancient Unix library */
void itoa(int n, char *buf, int radix);
char *itoa(int in, char *buf, int radix);
微软在其Visual C运行时库中提供了一个名为_itoa
的修改后名称。
C语言实现历史上不仅提供了不同定义的itoa
函数,C程序也为自己提供了一个名为itoa
的函数,这是可能发生冲突的另一个来源。
基本上,itoa
标识符在标准化方面是“放射性”的,作为外部名称或宏。如果这样的函数被标准化,它将必须使用不同的名称。
atoi
是历史悠久的函数,而itoa
则不是。你实际上不应该使用atoi
,而应该使用strto(u)l(l)
。对于反向转换,可以使用s(n)printf
。 - Daniel Fischeritoa
不是标准函数,您能否包含您想要讨论的itoa
函数的接口契约?这样做可能会回答您的问题。 - CB Baileystrcpy
)存在类似的问题,但它们都在“标准”总线上! - Pavan Manjunath