11

为什么会有这种区别?我遇到了可怕的问题,假设我最终将自定义版本itoa与不同的原型链接起来,从而产生了一些疯狂的错误。stdlib.hitoa

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

4

3 回答 3

7

Noitoa从未被标准化,因此要将其添加到标准中,您需要一个令人信服的理由和一个良好的界面来添加它。

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

于 2012-04-15T14:21:34.200 回答
2

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

于 2012-04-15T14:26:09.730 回答
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程序还为自己提供了一个名为itoafunction 的函数,这是可能发生冲突的另一个来源。

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

于 2016-11-30T20:44:31.477 回答