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

为什么这个区别? 我已经遇到了可怕的问题,假设itoastdlib.h ,最后将itoa的自定义版本与不同的原型相关联,从而产生一些疯狂的错误。

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

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

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

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

itoa函数可能不是标准的,原因是它没有一致的定义。 不同的编译器和库供应商已经引入了微妙的不同版本,可能作为发明作为atoi的补充。

如果供应商广泛提供了一些非标准function,那么标准的工作就是编写它:基本上将现有function的描述添加到标准中。 如果函数具有或多或少一致的参数约定和行为,则这是可能的。

因为itoa多种风格已经存在,所以这样的function不能添加到ISO C中。所描述的任何行为都与某些实现不一致。

itoa存在于以下forms:

 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标识符在标准化方面是“放射性的”作为外部名称或宏。 如果这样的function是标准化的,则必须使用不同的名称。