atoi是一个标准功能。但itoa不是。为什么?

时间:2012-04-15 14:07:58

标签: c function posix standards itoa

为什么要区别?我已经陷入了可怕的问题,假设itoa位于stdlib.h并最终将itoa的自定义版本与不同的原型相关联,从而产生一些疯狂的错误。< / p>

那么,为什么itoa不是标准函数呢?它出什么问题了?为什么标准偏向其孪生兄弟atoi

3 个答案:

答案 0 :(得分:7)

没有itoa已经标准化,因此要将其添加到标准中,您需要一个令人信服的理由和一个良好的界面来添加它。

我见过的大多数itoa接口要么使用具有重入和生命周期问题的静态缓冲区,要分配调用者需要释放的动态缓冲区,或者要求用户提供一个缓冲区来构建接口不比sprintf好。

答案 1 :(得分:2)

&#34; itoa&#34;函数必须返回一个字符串。由于字符串不是第一类对象,因此调用者必须传递缓冲区+长度,并且该函数必须有某种方式来指示它是否用完了房间。当你走到那么远的时候,你已经创建了类似于sprintf的东西,它不值得重复代码/功能。 &#34; atoi&#34;功能之所以存在,是因为它比完整的&#34; scanf&#34;更简单(并且可以说更安全)。呼叫。 &#34; itoa&#34;功能不会有足够的差异,不值得。

答案 2 :(得分:1)

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);

Microsoft在其Visual C运行时库中以更改的名称_itoa

提供它

不仅C实现历史上在不同的定义下提供它,C 程序还为自己提供了一个名为itoa函数的函数,这是可能发生冲突的另一个来源。

基本上,itoa标识符作为外部名称或宏标准化是“放射性的”。如果这样的功能是标准化的,则必须使用不同的名称